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:/ ...
随机推荐
- Android点9图的运用
在Android UI设计开发中,我们经常会用到一些图标.图片来做背景等. 相信很多同学都会遇到一个问题,就是我们让美工做好一张图,一个图标,呃,看起来挺好看的,但是放进app中,扩大或缩小.在不同分 ...
- vue2.0 引入font-awesome
网上的大部分教程复杂而且难看懂,其实两步就能搞定. 先cnpm install font-awesome --save引入依赖 然后在main.js引入 font-awesome/css/font-a ...
- BZOJ 3998 后缀数组
思路: 第一问 建出来后缀数组以后 前缀和一发n-sa[i]-ht[i]+1 二分 第二问 二分判断是带重复的第几 怎么判断呢 找到它 往后扫ht递减sum+=它 跟K判判 注意等于 加 ...
- Elasticsearch集群状态健康值处于red状态问题分析与解决(图文详解)
问题详情 我的es集群,开启后,都好久了,一直报red状态??? 问题分析 有两个分片数据好像丢了. 不知道你这数据怎么丢的. 确认下本地到底还有没有,本地要是确认没了,那数据就丢了,删除索引 ...
- overflow:解决 div的高度塌陷问题
高度塌陷是如何引起的? 解析: 当一个 div中所有的子 div都进行了浮动后,那么会出现该问题,那么解决方就是在父 div中 设置其 overflow:hidden;即可解决高度塌陷问题. 方式 ...
- SQL--大解密之组织数据
今天为大家带来的是数据库的基本用法 首先带大家了解下数据库. 大量的数据正在不断产生,伴随而来的是如何安全有效地存储.检索.管理他们. 对数据的有效存储.高效访问.方便共享和安全控制等问题成为信息 ...
- Ajax——异步基础知识(三)
封装异步请求 1.将函数作为参数进行使用 2.因为获取数据是在一个注册事件中获取的,所以只有事件触发的时候才会调用此函数 <!DOCTYPE html> <html lang=&qu ...
- html5——渐变
线性渐变 <style> div { width: 700px; height: 100px; /*方向:从右向左*/ /*起始颜色:黄色*/ /*终止颜色:绿色*/ background ...
- SQL基本操作——JOIN多表联查
基本概念 join :用于根据两个或多个表中的列之间的关系,从这些表中查询数据. join和key:有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join.数据库中的表可 ...
- [Windows Server 2008] IIS自带FTP配置方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:IIS自带FT ...