`
wujianjun12315
  • 浏览: 110054 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浏览器与服务器交互原理以及用java模拟浏览器操作

阅读更多
* 1,在HTTP的WEB应用中, 应用客户端和服务器之间的状态是通过Session来维持的, 而Session的本质就是Cookie,
* 简单的讲,当浏览器向服务器发送Http请求的时候, HTTP服务器会产生一个SessionID,这个SessionID就唯一的标识了一个客户端到服务器的请求会话过程.
* 就如同一次会议开始时,主办方给每位到场的嘉宾一个临时的编号胸牌一样, 可以通过这个编号记录每个嘉宾(客户端)的活动(请求状态).
* 为了保持这个状态, 当服务端向客户端回应的时候,会附带Cookie信息,当然,Cookie里面就包含了SessionID
* 客户端在执行一系列操作时向服务端发送请求时,也会带上这个SessionID, 一般来说,Session也是一个URL QueryParameter ,就是说,session可以以Key-Value的形式通过URL传递
* 比如,http://www.51etest.com/dede/login.php?PHPSESSIONID=7dg3dsf19SDf73wqc32fdsf
* 一般而言,浏览器会自动把此Session信息放入Header报文体中进行传递.
* 如果浏览器不支持Cookie,那么,浏览器会自动把SessionID附加到URL中去.
*
* 2,在这个例子中,以登陆这个功能点进行讲解.
* 首先,我们登陆的页面是http://www.51etest.com/dede, 我们第一次访问这个页面后,可以从服务器过来的Http Response报文中的Header中找出服务器与浏览器向关联的数据 — Cookie,
* 而且Session的值也在Cookie中. 于是,我们可以通过分析Set-Cookie这个Header中的参数的值,找到Seesion的Key-Value段.
* 然后,我们再向服务器发送请求,请求URL为:post@@http://www.51etest.com/dede/login.php@@userid=admin&pwd=tidus2005&gotopage=/dede/&dopost=login
* 服务器验证登陆成功了, 并且在此次会话变量中增加了我们登陆成功的标识.
*
* 3,增加一个广告定义
* 增加一个广告定义其实就是一个添加数据的过程,无非是我们把我们要添加的数据通过参数的形式告诉指定url页面,页面获取后添加到数据库去而已.
* 此url地址为:
* post@@http://www.51etest.com/dede/ad_add.php@@dopost=save&tagname=test&typeid=0&adname=test&starttime=2008-05-29
* 因为这个页面会先判断我是否登陆
* 而判断的依据,前面讲了,就是根据我请求时的SessionID找到指定的Session数据区中是否存在我的登陆信息,
* 所以我当然要把访问登陆页面时获取的SessionID原封不动的再发回去
* 相当于对服务器说,这是我刚刚来时,你发我的临时身份证,我现在可以形势我的权利。
*
* 这就是整个Java后台登陆网站,然后添加数据的过程。

/**

*/
package sky.dong.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

/**
* @author 核弹头
* Email:happyman_dong@sina.com 版权所有 盗版必究
* @since 2009-8-11
* @version 1.0
*/
public class HttpLoginTest {

    public static void main(String[] args) {
        String url = "http://discuzdemo.c88.53dns.com/logging.php?action=login&loginsubmit=yes&floatlogin=yes";//论坛的登陆页面
        String url2="http://discuzdemo.c88.53dns.com/post.php?infloat=yes&action=newthread&fid=2&extra=&topicsubmit=yes&inajax=1";//论坛的发贴页面
        HttpClient httpClient = new HttpClient();
        //httpClient.getHostConfiguration().setProxy("222.247.62.195", 8080);
        httpClient.getParams().setCookiePolicy(
                CookiePolicy.BROWSER_COMPATIBILITY);
        PostMethod postMethod = new PostMethod(url);
        PostMethod postMethod2 = new PostMethod(url2);
        NameValuePair[] data = {
                new NameValuePair("username", "123"),
                new NameValuePair("referer",
                        "http://discuzdemo.c88.53dns.com/index.php"),
                new NameValuePair("password", "123"),
                new NameValuePair("loginfield", "username"),
                new NameValuePair("questionid", "0"),
                new NameValuePair("formhash", "fc922ca7") };
        postMethod.setRequestHeader("Referer",
                "http://discuzdemo.c88.53dns.com/index.php");
        postMethod.setRequestHeader("Host", "discuzdemo.c88.53dns.com");
        // postMethod.setRequestHeader("Connection", "keep-alive");
        // postMethod.setRequestHeader("Cookie", "jbu_oldtopics=D123D;
        // jbu_fid2=1249912623; smile=1D1; jbu_onlineusernum=2;
        // jbu_sid=amveZM");
        postMethod
                .setRequestHeader(
                        "User-Agent",
                        "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2");
        postMethod
                .setRequestHeader("Accept",
                        "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        // postMethod.setRequestHeader("Accept-Encoding", "gzip,deflate");
        // postMethod.setRequestHeader("Accept-Language", "zh-cn");
        // postMethod.setRequestHeader("Accept-Charset",
        // "GB2312,utf-8;q=0.7,*;q=0.7");
        postMethod.setRequestBody(data);
        try {
            httpClient.executeMethod(postMethod);
            StringBuffer response = new StringBuffer();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    postMethod.getResponseBodyAsStream(), "gb2312"));//以gb2312编码方式打印从服务器端返回的请求
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line).append(
                        System.getProperty("line.separator"));
            }
            reader.close();
            Header header = postMethod.getResponseHeader("Set-Cookie");
            Cookie[] cookies=httpClient.getState().getCookies();//取出登陆成功后,服务器返回的cookies信息,里面保存了服务器端给的“临时证”
            String tmpcookies="";
            for(Cookie c:cookies){
                tmpcookies=tmpcookies+c.toString()+";";
                System.out.println(c);
            }
            System.out.println(tmpcookies);
//            System.out.println(header.getValue());
            System.out.println(response);
            NameValuePair[] data2 = {
                    new NameValuePair("subject", "测试自动发贴"),
                    new NameValuePair("message",
                            "能否发贴成功呢?测试一下就知道了"),
                    new NameValuePair("updateswfattach", "0"),
                    new NameValuePair("wysiwyg", "0"),
                    new NameValuePair("checkbox", "0"),
                    new NameValuePair("handlekey", "newthread"),
                    new NameValuePair("formhash", "885493ec") };
            postMethod2.setRequestHeader("cookie",tmpcookies);//将“临时证明”放入下一次的发贴请求操作中
            postMethod2.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "gbk");//因为发贴时候有中文,设置一下请求编码
            postMethod2.setRequestHeader("Referer",
                    "http://discuzdemo.c88.53dns.com/forumdisplay.php?fid=4");
            postMethod2.setRequestHeader("Host", "discuzdemo.c88.53dns.com");
            // postMethod.setRequestHeader("Connection", "keep-alive");
            // postMethod.setRequestHeader("Cookie", "jbu_oldtopics=D123D;
            // jbu_fid2=1249912623; smile=1D1; jbu_onlineusernum=2;
            // jbu_sid=amveZM");
            postMethod2
                    .setRequestHeader(
                            "User-Agent",
                            "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2");
            postMethod2
                    .setRequestHeader("Accept",
                            "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");//以上操作是模拟浏览器的操作,使用服务器混淆
            
            postMethod2.setRequestBody(data2);
            httpClient.executeMethod(postMethod2);
            StringBuffer response1 = new StringBuffer();
            BufferedReader reader1 = new BufferedReader(new InputStreamReader(
                    postMethod2.getResponseBodyAsStream(), "gb2312"));
            String line1;
            while ((line1 = reader1.readLine()) != null) {
                response1.append(line1).append(
                        System.getProperty("line.separator"));
            }
            reader1.close();
            System.out.println(response1);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            // TODO: handle exception
        } finally {
            postMethod.releaseConnection();
            postMethod2.releaseConnection();
        }

    }

}
飛奔嘅蝸牛
@Strong Yuan
浏览器与服务器交互原理以及用java模拟浏览器操作
Posted by strong on 2011/04/11 Leave a comment (0) Go to comments

* 1,在HTTP的WEB应用中, 应用客户端和服务器之间的状态是通过Session来维持的, 而Session的本质就是Cookie,
* 简单的讲,当浏览器向服务器发送Http请求的时候, HTTP服务器会产生一个SessionID,这个SessionID就唯一的标识了一个客户端到服务器的请求会话过程.
* 就如同一次会议开始时,主办方给每位到场的嘉宾一个临时的编号胸牌一样, 可以通过这个编号记录每个嘉宾(客户端)的活动(请求状态).
* 为了保持这个状态, 当服务端向客户端回应的时候,会附带Cookie信息,当然,Cookie里面就包含了SessionID
* 客户端在执行一系列操作时向服务端发送请求时,也会带上这个SessionID, 一般来说,Session也是一个URL QueryParameter ,就是说,session可以以Key-Value的形式通过URL传递
* 比如,http://www.51etest.com/dede/login.php?PHPSESSIONID=7dg3dsf19SDf73wqc32fdsf
* 一般而言,浏览器会自动把此Session信息放入Header报文体中进行传递.
* 如果浏览器不支持Cookie,那么,浏览器会自动把SessionID附加到URL中去.
*
* 2,在这个例子中,以登陆这个功能点进行讲解.
* 首先,我们登陆的页面是http://www.51etest.com/dede, 我们第一次访问这个页面后,可以从服务器过来的Http Response报文中的Header中找出服务器与浏览器向关联的数据 — Cookie,
* 而且Session的值也在Cookie中. 于是,我们可以通过分析Set-Cookie这个Header中的参数的值,找到Seesion的Key-Value段.
* 然后,我们再向服务器发送请求,请求URL为:post@@http://www.51etest.com/dede/login.php@@userid=admin&pwd=tidus2005&gotopage=/dede/&dopost=login
* 服务器验证登陆成功了, 并且在此次会话变量中增加了我们登陆成功的标识.
*
* 3,增加一个广告定义
* 增加一个广告定义其实就是一个添加数据的过程,无非是我们把我们要添加的数据通过参数的形式告诉指定url页面,页面获取后添加到数据库去而已.
* 此url地址为:
* post@@http://www.51etest.com/dede/ad_add.php@@dopost=save&tagname=test&typeid=0&adname=test&starttime=2008-05-29
* 因为这个页面会先判断我是否登陆
* 而判断的依据,前面讲了,就是根据我请求时的SessionID找到指定的Session数据区中是否存在我的登陆信息,
* 所以我当然要把访问登陆页面时获取的SessionID原封不动的再发回去
* 相当于对服务器说,这是我刚刚来时,你发我的临时身份证,我现在可以形势我的权利。
*
* 这就是整个Java后台登陆网站,然后添加数据的过程。


/**

*/
package sky.dong.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

/**
* @author 核弹头
* Email:happyman_dong@sina.com 版权所有 盗版必究
* @since 2009-8-11
* @version 1.0
*/
public class HttpLoginTest {

    public static void main(String[] args) {
        String url = "http://discuzdemo.c88.53dns.com/logging.php?action=login&loginsubmit=yes&floatlogin=yes";//论坛的登陆页面
        String url2="http://discuzdemo.c88.53dns.com/post.php?infloat=yes&action=newthread&fid=2&extra=&topicsubmit=yes&inajax=1";//论坛的发贴页面
        HttpClient httpClient = new HttpClient();
        //httpClient.getHostConfiguration().setProxy("222.247.62.195", 8080);
        httpClient.getParams().setCookiePolicy(
                CookiePolicy.BROWSER_COMPATIBILITY);
        PostMethod postMethod = new PostMethod(url);
        PostMethod postMethod2 = new PostMethod(url2);
        NameValuePair[] data = {
                new NameValuePair("username", "123"),
                new NameValuePair("referer",
                        "http://discuzdemo.c88.53dns.com/index.php"),
                new NameValuePair("password", "123"),
                new NameValuePair("loginfield", "username"),
                new NameValuePair("questionid", "0"),
                new NameValuePair("formhash", "fc922ca7") };
        postMethod.setRequestHeader("Referer",
                "http://discuzdemo.c88.53dns.com/index.php");
        postMethod.setRequestHeader("Host", "discuzdemo.c88.53dns.com");
        // postMethod.setRequestHeader("Connection", "keep-alive");
        // postMethod.setRequestHeader("Cookie", "jbu_oldtopics=D123D;
        // jbu_fid2=1249912623; smile=1D1; jbu_onlineusernum=2;
        // jbu_sid=amveZM");
        postMethod
                .setRequestHeader(
                        "User-Agent",
                        "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2");
        postMethod
                .setRequestHeader("Accept",
                        "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        // postMethod.setRequestHeader("Accept-Encoding", "gzip,deflate");
        // postMethod.setRequestHeader("Accept-Language", "zh-cn");
        // postMethod.setRequestHeader("Accept-Charset",
        // "GB2312,utf-8;q=0.7,*;q=0.7");
        postMethod.setRequestBody(data);
        try {
            httpClient.executeMethod(postMethod);
            StringBuffer response = new StringBuffer();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    postMethod.getResponseBodyAsStream(), "gb2312"));//以gb2312编码方式打印从服务器端返回的请求
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line).append(
                        System.getProperty("line.separator"));
            }
            reader.close();
            Header header = postMethod.getResponseHeader("Set-Cookie");
            Cookie[] cookies=httpClient.getState().getCookies();//取出登陆成功后,服务器返回的cookies信息,里面保存了服务器端给的“临时证”
            String tmpcookies="";
            for(Cookie c:cookies){
                tmpcookies=tmpcookies+c.toString()+";";
                System.out.println(c);
            }
            System.out.println(tmpcookies);
//            System.out.println(header.getValue());
            System.out.println(response);
            NameValuePair[] data2 = {
                    new NameValuePair("subject", "测试自动发贴"),
                    new NameValuePair("message",
                            "能否发贴成功呢?测试一下就知道了"),
                    new NameValuePair("updateswfattach", "0"),
                    new NameValuePair("wysiwyg", "0"),
                    new NameValuePair("checkbox", "0"),
                    new NameValuePair("handlekey", "newthread"),
                    new NameValuePair("formhash", "885493ec") };
            postMethod2.setRequestHeader("cookie",tmpcookies);//将“临时证明”放入下一次的发贴请求操作中
            postMethod2.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "gbk");//因为发贴时候有中文,设置一下请求编码
            postMethod2.setRequestHeader("Referer",
                    "http://discuzdemo.c88.53dns.com/forumdisplay.php?fid=4");
            postMethod2.setRequestHeader("Host", "discuzdemo.c88.53dns.com");
            // postMethod.setRequestHeader("Connection", "keep-alive");
            // postMethod.setRequestHeader("Cookie", "jbu_oldtopics=D123D;
            // jbu_fid2=1249912623; smile=1D1; jbu_onlineusernum=2;
            // jbu_sid=amveZM");
            postMethod2
                    .setRequestHeader(
                            "User-Agent",
                            "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2");
            postMethod2
                    .setRequestHeader("Accept",
                            "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");//以上操作是模拟浏览器的操作,使用服务器混淆
            
            postMethod2.setRequestBody(data2);
            httpClient.executeMethod(postMethod2);
            StringBuffer response1 = new StringBuffer();
            BufferedReader reader1 = new BufferedReader(new InputStreamReader(
                    postMethod2.getResponseBodyAsStream(), "gb2312"));
            String line1;
            while ((line1 = reader1.readLine()) != null) {
                response1.append(line1).append(
                        System.getProperty("line.separator"));
            }
            reader1.close();
            System.out.println(response1);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            // TODO: handle exception
        } finally {
            postMethod.releaseConnection();
            postMethod2.releaseConnection();
        }

    }

}


以上代码完成一个登陆论坛后在指定的版块自动发贴的功能
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

    java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥  Java生成密钥、保存密钥的实例源码...

    JAVA上百实例源码以及开源项目

    java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥  Java生成密钥、保存密钥的实例源码...

    java流程自动化工具

    四、模拟操作:接口调试,数据模拟,功能自测等等,适用于测试场景。 五、自动检测:基于流程循环,实现主动触发、检测、控制的需求场景,如服务器性能检测,应用存活检测,循环扫描操作等。 六、数据处理:如开发...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    目前市场业务中在产品以及其他项目的认证和检测方面存在诸多不便,用户需要实地考察并频繁与检测单位沟通,填写繁琐的纸质检测报告、当面送递样品,对于检测环节中存在的问题难以及时交互并处理。市场上相应的检测...

    Spring websocket+Stomp+SockJS 实现实时通信 详解

    一次连接以后,会建立tcp连接,后续客户端与服务器交互为全双工方式的交互方式,客户端可以发送消息到服务端,服务端也可将消息发送给客户端。 SockJS 是 WebSocket 技术的一种模拟。为了应对许多浏览器不支持...

    JavaScript完全自学宝典 源代码

    示例描述:介绍JavaScript与各种浏览器插件的交互方法。 15.1.html 使用JavaScript操作Java Applet。 15.2.html 在Java Applet中调用JavaScript。 15.3.svg 基本SVG文件。 15.4.svg 使用JavaScript...

    Java经典入门教程pdf完整版

    Java经典入门教程pdf完整版Java私塾跟我学系列JAⅥ篇网址:htp:/www.lavass.Cn电话:010-86835215 3;Java是一种软件运行平台 3.1:什么是软件的运行平台 ...Java虚拟杋是在真实札器中用软件模拟实现的—种想象...

    网页聊天室源码java-chat-socket.io:聊天socket.io

    一般来说,浏览器在接收到客户端请求(request)的时候,会发送给服务器端进行处理,服务器端处理完毕后会返回结果(response), 这样就完整地完成了一次HTTP的请求。当客户端想再更新页面信息的时候,需要刷新浏览器,...

    java餐饮小程序源码-awesome-stars:我的GitHub星星的精选列表!

    使用模拟退火进化图像 - Android 的私人信使。 - 现代 HTTP 基准测试工具 - 没有废话,简约的 HTTP 负载生成器 - 一种用于 nodejs 的新型无头 webkit 集成; phantomjs 的绝佳替代品。 - 适用于 1.9.2 和 1.9.3 的 ...

    JavaScript基础和实例代码

    1.11 JavaScript与Java、Java applet 1.12 JavaScript的未来如何 1.13 本章小结 第2章 JavaScript语言入门 2.1 编程准备 2.1.1 编程术语 2.1.2 脚本执行顺序 2.1.3 大小写敏感 2.1.4 空白字符 2.1.5 分号 2.1.6 块 ...

    源文件程序天下JAVASCRIPT实例自学手册

    1.11 JavaScript与Java、Java applet 1.12 JavaScript的未来如何 1.13 本章小结 第2章 JavaScript语言入门 2.1 编程准备 2.1.1 编程术语 2.1.2 脚本执行顺序 2.1.3 大小写敏感 2.1.4 空白字符 2.1.5 分号 2.1.6 块 ...

    计算机网络&计算机网络

    17.1.1 浏览器和服务器 17.1.2 HTTP 17.1.3 HTML语言 17.2 交互式动态页面 17.2.1 CGI 17.2.2 Java 17.2.3 ASP 17.3小结 习题 第五部分 网络管理与安全 第18章 网络管理 18.1 互连网管理 18.2 SNMP网管...

    计算机网络(汲及内容全面)

    17.1.1 浏览器和服务器 17.1.2 HTTP 17.1.3 HTML语言 17.2 交互式动态页面 17.2.1 CGI 17.2.2 Java 17.2.3 ASP 17.3小结 习题 第五部分 网络管理与安全 第18章 网络管理 18.1 互连网管理 18.2 SNMP网管...

    软件工程课程设计-在线视频网站设计毕业用资料.docx

    1.3系统结构设计与功能分析 1.3.1系统结构设计 本文是基于Browser/Server模式的一种JSP结合Java的在线视频的设计与实现,主要功能是达到客户端和客户端通过服务器的动态交互。人们通过浏览器就可以访问各种需要的...

    计算机网络基础知识

    17.1.1 浏览器和服务器 17.1.2 HTTP 17.1.3 HTML语言 17.2 交互式动态页面 17.2.1 CGI 17.2.2 Java 17.2.3 ASP 17.3小结 习题 第五部分 网络管理与安全 第18章 网络管理 18.1 互连网管理 18.2 SNMP网管...

    经典全面系统的网络工程师资料

    17.1.1 浏览器和服务器 17.1.2 HTTP 17.1.3 HTML语言 17.2 交互式动态页面 17.2.1 CGI 17.2.2 Java 17.2.3 ASP 17.3小结 习题 第五部分 网络管理与安全 第18章 网络管理 18.1 互连网管理 18.2 SNMP网管...

    2009.6.19—30举办3S研讨会暨Google Earth与Google Map等仿真建模与共享及ARCGIS与遥感高级程序员培训班

    5、介绍如何使用ARCCIS9的SPATIAL ANALYST扩展模块:在栅格数据和矢量数据集成的环境下进行空间分析操作(ARCCIS在环保与流行病统计分析以及环境监测的应用为例介绍),并介绍地统计学基础以及一种先进的空间插值...

    mcg-helper流程自动化工具-其他

    mcg-helper是一款研发个化性流程自动化工具,提供一套可视化“流程自动化”的规范,丰富的拖拽控件,良好的交互性,基于流程图实现自动化,能够很好感知到可...WEB SSH,通过浏览器即可与Linux交互,支持google身份认证

    精通JavaScript

    服务器采用IIS5.1 或以上版本 数据库使用MS Access 2000以上 2.本书所附光盘实例代码: 第1章(\第1章) 查看1.2.htm中noscript显示效果的方法如下: 1.将该实例复制到C:\Inetpub\wwwroot下; 2.选择浏览器的...

Global site tag (gtag.js) - Google Analytics