近期在做公司一个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模拟登录实例的更多相关文章

  1. Java模拟登录系统抓取内容【转载】

    没有看考勤的习惯,导致我的一天班白上了,都是钱啊,系统也不发个邮件通知下....     为了避免以后还有类似状况特别写了个java模拟登录抓取考勤内容的方法(部分代码来自网络),希望有人修改后也可以 ...

  2. Java模拟登录带验证码的教务系统(原理详解)

    一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...

  3. java 模拟登录新浪微博(通过cookie)

    这几天一直在研究新浪微博的爬虫,发现爬取微博的数据首先要登录.本来打算是通过账号和密码模拟浏览器登录.但是现在微博的登录机制比较复杂.通过账号密码还没有登录成功QAQ.所以就先记录下,通过cookie ...

  4. 【Java】模拟登录教务网并获取数据

    本文章仅做技术交流演示学习,请勿用于违法操作! 前期准备 首先我们需要到要模拟登录的网页,进行抓包操作. 使用Chrome浏览器打开系统的登录页面,按F12打开开发者工具 切换到Network选项卡 ...

  5. Java通过httpclient获取cookie模拟登录

    package Step1; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Htt ...

  6. php_curl模拟登录有验证码实例

    <?php/** * @author 追逐__something * @version $id */define('SCRIPT_ROOT',dirname(__FILE__).'/');$ac ...

  7. Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇

    前言 并不是所有的网站都能够敞开心扉让你看个透彻,它们总要给你出些难题让你觉得有些东西是来之不易的,往往,这也更加激发你的激情和斗志! 从<为了媳妇的一张号,我与百度医生杠上了>里就有网友 ...

  8. Java爬虫——模拟登录知乎

    登录界面,首先随意输入一个账号,登录查看发送表单的请求 可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: passwo ...

  9. Java爬虫——人人网模拟登录

    人人网登录地址:http://www.renren.com/ 此处登录没有考虑验证码验证码. 首先对登录方法进行分析 有两种方法. 一)在Elements中分析源码 发现登录点击后的事件是http:/ ...

随机推荐

  1. Kafka详解与总结(三)

    Kafka分片存储机制 几个kafka重要概念: Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群. Topic:一类消息,例如pa ...

  2. centos源更新

    .备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup .下载新的CentOS-Base.r ...

  3. 类型判断----小白讲解typeof,instanceof,Object.prototype.toString.call()

    1.typeof只能判断基本类型数据, 例子: typeof 1 // "number" typeof '1' // "string" typeof true ...

  4. 个人作业 - Alpha 项目测试

    写在前面 课程链接:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求:https://edu.cnblogs.com ...

  5. 使用Visual Studio Code + Node.js搭建TypeScript开发环境

    Visual Studio Code搭建Typescript开发环境 —— 相关文章: http://www.cnblogs.com/sunjie9606/p/5945540.html [注意:这里仅 ...

  6. Android开发问题-真机调试连接

    出现“no debuggable processes”可以: 1)尝试Tools->android->Enable ADB Intergration使之选中: 2)换一根数据线试试. 初次 ...

  7. JS——百度背景图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  9. DFA最小化实例

    原始DFA如下图所示 最小化的定义:1.没有多余的状态(死状态):2.没有两个状态是相互等价的: 两个状态等价的含义:1.兼容性(一致性)——同是终态或同是非终态:2.传播性(蔓延性)——从s出发读入 ...

  10. C#关键字详解第二节

    base:基类 在有些书中base的解释为表示父类,没错,base可以表示父类,但我更想理解成基类,因为更原始更具象,既 然是类,那么他就符合面向对象的设计规则和特点,我们知道面向对象的三个特点是封装 ...