`
wujianjun12315
  • 浏览: 111773 次
  • 性别: 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语言编写的模拟服务器与浏览器交互流程设计源码,包含110个文件,其中包含81个PNG图片文件、11个Java源代码文件、9个类文件、4个XML配置文件、2个属性文件、1个Git忽略文件以及1个Markdown文件,旨在...

    Web浏览器和服务器的设计与实现开题报告

    【Web浏览器和服务器的设计与实现】的开题报告主要探讨了在J2EE平台上使用Java语言开发Web浏览器和服务器的技术细节。在这个项目中,我们关注的是如何构建一个交互式的、功能丰富的Web浏览器,并且理解服务器如何...

    JAVA框架技术实验内容_HotJava浏览器_java_appletweb_

    2. **编写Java Applet代码**:使用Java语言编写applet,包括绘图、响应用户输入、与服务器通信等功能。 3. **创建HTML页面**:学习如何在HTML页面中嵌入Java applet,设置必要的参数,如`<applet>`标签的`code`、`...

    java获取浏览器代理设置

    在Java编程中,获取浏览器的代理设置是一项重要的任务,特别是在开发网络应用或者需要模拟用户网络环境的场景下。本文将详细讲解如何利用Java来获取浏览器的代理设置,并结合提供的文件`registry.jar`和`ICE_...

    java代码的浏览器源码整理

    5. **GUI编程**:Java Swing或JavaFX库用于创建用户界面,模拟浏览器的各种功能如地址栏、前进/后退按钮、书签等。 6. **多线程**:为了实现异步加载,浏览器通常会使用多线程,一个线程处理网络请求,另一个线程...

    jBrowserDriver是一个纯Java编写的可编程嵌入式的浏览器驱动基于WebKit

    这使得它在不需要实际显示浏览器窗口的情况下进行自动化测试和网页操作,尤其适用于服务器端自动化场景。 **WebKit引擎** WebKit是开源的Web渲染引擎,被广泛用于许多操作系统和应用程序中,如Apple的Safari和...

    JAVA浏览器小实例

    8. **事件处理**:与UI相关的,需要编写事件处理器来响应用户的交互,例如点击按钮打开新页面,这涉及到JAVA的事件监听机制。 9. **异常处理**:在处理网络请求和解析响应时,可能会遇到各种异常,如`IOException`...

    java实现的浏览器

    2. 渲染页面:对于页面的渲染,Java可以通过`javax.swing`库创建GUI组件来模拟浏览器界面,显示HTML内容。然而,Java图形界面(GUI)在复杂性和性能上可能不如专门的Web渲染引擎如WebKit或Blink。 3. 脚本支持:...

    在浏览器上运行Java程序 Doppio

    深入研究源码可以帮助你理解Doppio如何模拟JVM行为,以及如何实现与JavaScript环境的交互。 **开发语言** Doppio 的实现语言是JavaScript,这使得它能够很好地融入Web生态。JavaScript作为一个广泛使用的客户端...

    所有浏览器驱动,python、java自动化测试所有依赖驱动

    通过Selenium WebDriver接口,开发者可以使用Python或Java编写测试脚本来模拟用户操作,如点击、输入、导航等。ChromeDriver适用于最新版本的Chrome浏览器,并且需要与浏览器版本相匹配,以确保兼容性。 2. **...

    java内嵌浏览器jxbrowser使用教程

    Java内嵌浏览器JxBrowser是一款强大的工具,它允许开发者在Java应用程序中集成Web浏览器功能,其内核基于Chromium,因此能良好地兼容大部分基于现代Web标准的前端框架,如React、Vue、Angular等。本教程将深入讲解...

    java+js交互Demo

    对于需要在Java后端执行JavaScript的场景,可以使用Apache HttpClient模拟浏览器行为,或者使用Jsoup库解析和操作HTML文档。这样,Java可以发起HTTP请求,获取网页内容,然后通过JavaScript处理。 总之,Java和...

    java浏览器

    这个项目可能是一个学习和实践Java编程技巧的小实例,特别适合初学者理解Java如何与Web交互。Java浏览器的核心功能包括加载网页、解析HTML、渲染页面以及支持用户的一些基本操作,如前进、后退、刷新和书签管理。 ...

    java rtsp 模拟播放

    这段代码展示了如何使用Java实现一个简单的RTSP客户端,它与服务器进行交互以请求流媒体资源。以下是对代码中关键知识点的详细解释: 1. **RTSP协议**:RTSP是一种应用层协议,用于控制多媒体数据的传输。它允许...

    纯java浏览器源码

    在Java编程领域,创建一个基于Java的浏览器是一个挑战性的项目,它可以深化对JavaSE(标准版)的理解,尤其是Swing库的使用,用于构建图形用户界面(GUI)。这个“纯Java浏览器”项目,正如其名,完全由Java语言编写...

    JAVA模拟网页发送请求

    ### JAVA模拟网页发送请求 #### 一、概述 在日常的开发工作中,有时我们需要通过程序自动地访问某个网站并获取其内容,或者模仿用户的行为进行登录等操作。这些需求可以通过模拟HTTP请求的方式实现。本篇文章将...

    网页浏览器 模拟网页浏览器

    这个名为"WebBrowser"的项目,据描述是用Java编程语言实现的一个实验性浏览器,旨在提供基本的网页浏览功能。Java作为一种跨平台的编程语言,因其强大的面向对象特性而被广泛用于开发各种应用,包括网络应用。 首先...

    java中使用session模拟用户登陆

    本篇文章将详细讲解如何在Java中使用Session来模拟用户登录。 首先,我们需要理解Session的工作原理。Session是服务器为每个客户端(浏览器)创建的一个数据存储结构,通常是一个HashMap。当用户登录时,服务器会...

    java在线编辑保存Word文件(支持跨浏览器)

    4. **用户编辑**: 用户在浏览器中看到的Word文档是PageOffice组件在服务器端模拟生成的,用户的所有编辑操作都会实时同步到服务器端的Word文档。 5. **保存文档**: 当用户完成编辑并点击“保存”按钮时,JavaScript...

    java模拟登陆新浪微博(非API)

    我们将不依赖新浪提供的官方API,而是通过模拟浏览器的行为,实现自动化登录和交互。 首先,我们需要理解模拟登录的基本原理。它涉及到网络请求、HTTP协议、cookies管理以及可能的验证码处理。在Java中,我们可以...

Global site tag (gtag.js) - Google Analytics