JAVA模拟登录实例
近期在做公司一个web项目。要求在我们的系统上,可以显示其它站点上的数据。
刚開始接到这个任务时,还在想。简单的非常。直接用UrlConection直接进入该网页,然后获取该网页的html,取到想要的数据。返回给我们的系统的前台页面,打印出来。
还想到了设计模式,以便今后扩展至可以查看多个网页。
但是。思路是简单的,真正做的时候却乱了思路。。。
这个网页还要登录。。。
于是在网上找模拟登录的实例。查了一下,思路是这种:
a)先把帐号与password加如到请求中。
然后进行登录
b)在登录之后。获取登录的cookie
c)依据获取的cookie,再訪问你想要的去的地址。
与之前的差别是。在输出流中。添加账户名和password,代码例如以下
StringBuffer sb = new StringBuffer();
sb.append("email="+usr);
sb.append("&password="+pwd);
OutputStream os = connection.getOutputStream();
os.write(sb.toString());
可是运行的时候,返回的html却是没有登录的页面。
发现还是因为登录的时候出现错误,cookie也没有收到。
那么问题就来了,登录网页究竟哪家强?
这个email和password这两个參数,我用的是html帐号和密码元素的id。这两个參数名对吗?这两个还要其它值吗?这个方式究竟对不正确?
然后又在网上继续探索。。。
于是出现了以下的代码:
package com.task; import java.util.ArrayList;
import java.util.List; import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP; public class RenRen {
// The configuration items
private static String userName = "你的帐号";
private static String password = "你的密码";
private static String redirectURL = "http://jk.coolchuan.com/report/total-downloads"; // Don't change the following URL
private static String renRenLoginURL = "http://www.coolchuan.com/sign_in"; // The HttpClient is used in one session
private HttpResponse response;
private DefaultHttpClient httpclient = new DefaultHttpClient(); private boolean login() {
HttpPost httpost = new HttpPost(renRenLoginURL);
// All the parameters post to the web site
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("redirect_uri", ""));
nvps.add(new BasicNameValuePair("user[remember_me]", "1"));
nvps.add(new BasicNameValuePair("user[email]", userName));
nvps.add(new BasicNameValuePair("user[password]", password));
try {
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);
CookieStore cookieStore = httpclient.getCookieStore();
List<Cookie> cookies = cookieStore.getCookies();
for(Cookie c : cookies) {
System.out.println("#############"+c);
}
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
httpost.abort();
}
return true;
} private String getRedirectLocation() {
Header[] headers = response.getAllHeaders();
for(int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
Header locationHeader = response.getFirstHeader("Location");
if (locationHeader == null) {
return null;
}
return locationHeader.getValue();
} private String getText(String redirectLocation) {
HttpGet httpget = new HttpGet(redirectLocation);
// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = "";
try {
responseBody = httpclient.execute(httpget, responseHandler);
} catch (Exception e) {
e.printStackTrace();
responseBody = null;
} finally {
httpget.abort();
httpclient.getConnectionManager().shutdown();
}
return responseBody;
} public void printText() {
if (login()) {
// String redirectLocation = getRedirectLocation();
if (redirectURL != null) {
System.out.println(getText(redirectURL));
}
}
} public static void main(String[] args) {
RenRen renRen = new RenRen();
renRen.printText();
}
}
第27行,就是登录的url,第24行是重定向的url,也就是登录后我想要跳转到的url
那么问题又来了。第37行到第40行,帐号,password为什么要这样写?怎么多出了个redirect_uri和user[remember_me]?
做过web的同学都清楚。在登录页面提交请求的时候,事实上就是提交一个表单。须要在请求中增加參数,后台在接的时候。依据接到的參数。进行推断。接到的參数是否正确,进而返回前台是否登录成功。
假设成功,则进入成功跳转页面,假设不成功。则还是登录页面,提示信息,”登录失败“。
请求的參数名,是须要通过工具查看的。
我推荐用firefox的firebug。
Firebug的网络监视器相同是功能强大的,可以查看HttpRequests请求的http头等等。以下给出详细查看过程:
1、打开火狐浏览器,按F12打开firebug,打开网络选项卡(假设是第一次打开,则须要点击“启动”button),点击”保持“
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHl6dHR6eno=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
2、地址栏输入网页url,这里输入的是 http://www.coolchuan.com/sign_in。再点击“清除”。把多余的网络请求清掉
3、输入帐号password。然后登录,查看网络情况,找到Post的请求,例如以下图:
哈哈,想要的參数来了。
这个參数就是模拟登录的关键点。看来最初的设想都是错误的。
这里也出来了一个非常严重的站点的漏洞。请同学们自行寻找吧,嘿嘿。
JAVA模拟登录实例的更多相关文章
- Java模拟登录系统抓取内容【转载】
没有看考勤的习惯,导致我的一天班白上了,都是钱啊,系统也不发个邮件通知下.... 为了避免以后还有类似状况特别写了个java模拟登录抓取考勤内容的方法(部分代码来自网络),希望有人修改后也可以 ...
- Java模拟登录带验证码的教务系统(原理详解)
一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...
- java 模拟登录新浪微博(通过cookie)
这几天一直在研究新浪微博的爬虫,发现爬取微博的数据首先要登录.本来打算是通过账号和密码模拟浏览器登录.但是现在微博的登录机制比较复杂.通过账号密码还没有登录成功QAQ.所以就先记录下,通过cookie ...
- 【Java】模拟登录教务网并获取数据
本文章仅做技术交流演示学习,请勿用于违法操作! 前期准备 首先我们需要到要模拟登录的网页,进行抓包操作. 使用Chrome浏览器打开系统的登录页面,按F12打开开发者工具 切换到Network选项卡 ...
- Java通过httpclient获取cookie模拟登录
package Step1; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Htt ...
- php_curl模拟登录有验证码实例
<?php/** * @author 追逐__something * @version $id */define('SCRIPT_ROOT',dirname(__FILE__).'/');$ac ...
- Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇
前言 并不是所有的网站都能够敞开心扉让你看个透彻,它们总要给你出些难题让你觉得有些东西是来之不易的,往往,这也更加激发你的激情和斗志! 从<为了媳妇的一张号,我与百度医生杠上了>里就有网友 ...
- Java爬虫——模拟登录知乎
登录界面,首先随意输入一个账号,登录查看发送表单的请求 可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: passwo ...
- Java爬虫——人人网模拟登录
人人网登录地址:http://www.renren.com/ 此处登录没有考虑验证码验证码. 首先对登录方法进行分析 有两种方法. 一)在Elements中分析源码 发现登录点击后的事件是http:/ ...
随机推荐
- 使用Visual Studio Code + Node.js搭建TypeScript开发环境
Visual Studio Code搭建Typescript开发环境 —— 相关文章: http://www.cnblogs.com/sunjie9606/p/5945540.html [注意:这里仅 ...
- BZOJ 3998 后缀数组
思路: 第一问 建出来后缀数组以后 前缀和一发n-sa[i]-ht[i]+1 二分 第二问 二分判断是带重复的第几 怎么判断呢 找到它 往后扫ht递减sum+=它 跟K判判 注意等于 加 ...
- ClouderaManager与CDH
* ClouderaManager与CDH 集群简述 对于企业而言,一般的集群大小规模大概是如下映射关系: 集群大小 小:10~30节点 中:100~300节点 大:1000+节点 对应所需的zook ...
- 【转】Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例 ...
- Python--10、进程知识补充
守护进程 基于进程启动的子进程,会和主进程一起结束.主进程结束的依据是程序的代码执行完毕. #创建守护进程p=Process(task) p.daemon = True p.start() 子进程需要 ...
- 【PostgreSQL-9.6.3】临时表
PostgreSQL中的临时表分两种,一种是会话级临时表,一种是事务级临时表.在会话级临时表中,数据可以存在于整个会话的生命周期中,在事务级临时表中的数据只能存在于事务的生命周期中.1. 会话级临时表 ...
- JS——null
变量被赋值为null,目的往往是为了销毁这个对象: var n1 = 1; n1 = null;
- shell编程之grep命令的使用
大家在学习正则表达式之前,首先要明确一点,并把它牢牢记在心里,那就是: 在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,不要把二者搞混了.切记!!! 通常有三种文本处理工具/ ...
- ABP生成错误:必须添加对程序集“netstandard”的引用
当前使用ABP版本为:4.6.0 升级vs2017到15.4版本,升级framework到4.7版本 如果Core版本请升级到net core 2
- STL_string用法总结
参考自:http://blog.csdn.net/y990041769/article/details/8763366 1:string对象的定义和初始化以及读写 string s1; 默认 ...