HttpClient相关

来源:互联网 发布:java 驻场开发 编辑:程序博客网 时间:2024/05/17 20:14

工具介绍:

       可以使用httpLook来抓包,不管是浏览器发出的还是httpClient发出的都可以抓到。但貌似对https无效。IE浏览器还可以使用httpWatch。

 

分类经验:

1、  如果码流中抓出了Expect:100-Continue,是因为httpClient默认开了这个握手,可以关掉,方式如下:

        HttpPost loginPost = new HttpPost(targetURL);

       loginPost.getParams().setBooleanParameter(

                CoreProtocolPNames.USE_EXPECT_CONTINUE,false);

 

2、  打印response中的码流可以参考如下代码(网友贡献):

        InputStream is =entity.getContent();

        BufferedReader in = new BufferedReader(newInputStreamReader(is));

        List<Byte> li = newArrayList<Byte>();

        int i;

        while ((i = is.read()) != -1)

        {

            li.add((byte) i);

        }

        byte a[] =newbyte[li.size()];

        for (i = 0; i < a.length; i++)

        {

            a[i] = (byte) li.get(i);

        }

        String finalStr = new String(a,"UTF-8");

使用的编码格式可以参考返回报文头中的Content-Type: text/html; charset=utf-8。

       但有时候发消息过去时如果头部设置了Accept-Encoding:gzip, deflate,即使解码格式设置正确,也打印出乱码来,那是因为,浏览器对于从服务器中返回的对应的gzip压缩的网页,会自动解压缩,所以在request中添加对应的头,表明自己接受压缩后的数据,httpClient也可以用GzipDecompressingEntity来进行解压再打印。

3、  httpClient自动支持session:

        HttpClientParams.setCookiePolicy(client.getParams(),

                CookiePolicy.BROWSER_COMPATIBILITY);

收到的类似Set-Cookie:_session_id=a17665f6fb4887c8f37607ebeed01f8e; path=/; HttpOnly会自动进行request时的session设置,也就是session可以维持了。比如下次发出去就是:Cookie:_session_id=a17665f6fb4887c8f37607ebeed01f8e。只要client对象不灭掉这个session就一直有效。

4、  额外的会话维持条件

这点其实跟httpClient没啥太大的关系。有些网站的业务逻辑控制不能仅用一个cookie里的session标志来维持会话,还会设置额外的条件,如果达不到,即使登录成功并且cookie支持,也会使会话失效(可能是防CSRF攻击用,参考http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html)。像这样的网站,我们除了猜没啥办法。

比如说抓码流的时候,发现post内容中有个authValue=9u20o4nnfg02gnosdng2h0ghsg0in,猜想这个玩意可能跟会话维持有关,遂寻找所有抓到的码流内容,终于在一个页面中找到了类似这样:<input name="authValue" type="hidden"value="9u20o4nnfg02gnosdng2h0ghsg0in " />,那么可以想象是这么个流程:登录后-》网站通过用户名和密码和sessionID生成字符串-》发回给登录后的某个页面-》后面所有流程中通过input自动带往后台-》用户名、密码、sessionID再匹配。那么现在我们就要在登录后把那个页面码流抓下来,在以后的流程中自动设置authValue值即可。

 

原创粉丝点击