`
xvm03
  • 浏览: 144298 次
  • 来自: ...
社区版块
存档分类
最新评论

ZT---httpclient如何保持session会话模拟登录后的操作

阅读更多



转帖自:

http://www.ehelper.com.cn/blog/post/java-httpclient-browser.html

 

非常谢谢作者的分享,以下内容仅供自己学习使用

 

 

 

八月 12, 2009 | 标签 http  httpclient   | 浏览 3551

评论 3

* 1,HTTPWEB应用中, 应用客户端和服务器之间的状态是通过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中的参数的值,找到SeesionKey-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(); 
        } 
 
    } 
 

 


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

 

 

分享到:
评论
3 楼 jbeduhai 2012-06-29  
发贴能成功吗,我执行的怎么是说没有登录呢,前面登录是正常的,发贴有问题,是什么情况
2 楼 xvm03 2011-07-06  
模拟登录时如果有验证码,有开源工具可以帮助去分析验证码,不是特别复杂的还是可以分析出来的,然后作为参数带入进行登录
1 楼 txin0814 2011-06-28  
如果登录有验证码 应怎么处理呢

相关推荐

    httpclient如何保持session会话模拟登录后的操作

    本篇文章将深入探讨如何使用HTTPClient来实现session会话的保持,并在模拟登录后执行后续的操作。 首先,了解HTTP协议的基础知识是非常重要的。HTTP协议是无状态的,这意味着每次请求之间没有任何关联。为了保持...

    Java 使用HttpClient保持SESSION状态

    在处理Web应用程序时,有时我们需要保持用户的登录状态,即SESSION状态。这通常涉及到Cookie管理,因为服务器通过Cookie来跟踪客户端的会话。下面我们将详细探讨如何在Java中使用HttpClient来实现这一目标。 首先,...

    httpclient-4.5jar

    httpclient-4.5所需jar包,里面包含httpclient-4.5.jar等等10个必须的开发包。 1.commons-codec-1.9.jar 2.commons-logging-1.2.jar 3.fluent-hc-4.5.jar 4.httpclient-4.5.jar 5.httpclient-cache-4.5.jar 6....

    java httpclient 模拟登录

    在"java httpclient 模拟登录"这个场景下,我们通常会用到HttpClient来模拟用户登录网站的过程,获取登录后的session信息,以便后续能够访问登录后才能看到的页面内容。以下将详细介绍如何使用Java HttpClient进行...

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    《JAVA中使用HttpClient:commons-httpclient-3.0.jar详解》 在JAVA开发中,进行HTTP请求时,Apache的HttpClient库是一个不可或缺的工具。本文将深入解析`commons-httpclient-3.0.jar`,它是HttpClient的一个重要...

    httpclient-4.5.6的jar包

    httpclient-4.5.6.jar, commons-codec-1.10.jar, commons-logging-1.2.jar , fluent-hc-4.5.6.jar, httpclient-cache-4.5.6.jar, httpclient-win-4.5.6.jar , httpcore-4.4.10.jar, httpmime-4.5.6.jar, jna-4.4.0....

    httpcore-4.2.4,httpclient-4.2.5,httpclient-cache-4.2.5,httpmime-4.2.5的jar包下载

    这里提到的四个jar包——httpcore-4.2.4,httpclient-4.2.5,httpclient-cache-4.2.5,httpmime-4.2.5,都是Apache HttpClient库的不同组件,用于支持HTTP通信和相关功能。 **httpcore-4.2.4.jar** 是HTTP Core模块...

    HttpClient-4.3.6

    这个压缩包“HttpClient-4.3.6”包含了该版本的所有核心组件和示例,旨在方便开发者快速集成和使用。 在HttpClient-4.3.6中,主要包含以下几个部分: 1. **lib** 目录:这个目录下包含了HttpClient运行所需的依赖...

    手动修改编码为UTF-8 的 commons-httpclient-3.1包

    在开发中遇到乱码问题 上传文件并传其它参数时 按网上多种方法尝试设置UTF-8编码总是不好用,只好修改源码统一编码为utf-8 后打包,解决问题 此包没有经过其它编码环境下测试,不过应该不会有其它影响

    httpcomponents-httpclient-4.5.8-bin-src.zip

    httpclient-4.5.8.jar; httpclient-cache-4.5.8.jar; httpclient-osgi-4.5.8.jar; httpclient-win-4.5.8.jar; httpcore-4.4.11.jar; httpmime-4.5.8.jar; jna-4.5.2.jar; jna-platform-4.5.2.jar

    httpclient4.5.3 jar完整包含所有依赖包

    * [HTTPCLIENT-1803] Improved handling of malformed paths by URIBuilder. Contributed by Oleg Kalnichevski * [HTTPCLIENT-1802] Do not attempt to match SSL host to subject ...

    httpclient-4.5.13-API文档-中英对照版.zip

    包含翻译后的API文档:httpclient-4.5.13-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.httpcomponents:httpclient:4.5.13; 标签:apache、httpcomponents、httpclient、jar包、java、中英...

    wink-client-apache-httpclient-1.4.zip

    【标题】"wink-client-apache-httpclient-1.4.zip" 涉及的知识点主要围绕Apache HttpClient库以及Wink客户端API。Apache HttpClient是一个Java库,它提供了强大的HTTP协议客户端实现,支持从简单的GET请求到复杂的...

    httpclient-cache-4.5.jar

    用于http请求的jar包

    wechatpay-apache-httpclient-0.2.1.jar

    wechatpay-apache-httpclient-0.2.1.jar

    httpclient-4.5.8.zip

    本包里面基本已经齐全,包含以下版本的包commons-codec-1.11.jar,commons-logging-1.2.jar,fluent-hc-4.5.8.jar,httpclient-4.5.8.jar,httpclient-cache-4.5.8.jar,httpclient-osgi-4.5.8.jar,httpclient-win-...

    commons-codec-1.3.jar\commons-logging-1.1.1.jar\httpclient-4.0.1.jar

    常用的Commsjar包:commons-codec-1.3.jar\commons-logging-1.1.1.jar\httpclient-4.0.1.jar\httpcore-4.0.1.jar\GJson.jar

    httpclient-4.5.10.jar

    httpclient jar包

    httpclient-4.5.10-API文档-中文版.zip

    包含翻译后的API文档:httpclient-4.5.10-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.httpcomponents:httpclient:4.5.10; 标签:apache、httpcomponents、httpclient、中文文档、jar包、java; ...

Global site tag (gtag.js) - Google Analytics