`
jinnianshilongnian
  • 浏览: 21439826 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2406102
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2998575
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5632108
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257776
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593485
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:249078
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5848368
Group-logo
跟我学Nginx+Lua开...
浏览量:698415
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780838
社区版块
存档分类
最新评论

不同工具(jsoup、httpclient)获取多个同路径下同名Cookie的问题

 
阅读更多

这两天在iteye的问答中有一个【java中使用jsoup获取cookies】问题, 地址:http://www.iteye.com/problems/87415

 

不知大家遇到类似的问题吗,希望一起探讨。


1、首先第一次访问http://www.17sct.com/city.php?ename=CHANGZHOU,我们可以看到如下请求:


我们看到 设置了两个 99a0_city cookie, 值分别为1 和 269;如chrome、firefox、ie8将选择最后一个作为cookie值。

 

好像没什么问题,接下来继续看两个工具:

1、jsoup

 

        Connection conn = Jsoup.connect("http://www.17sct.com/city.php?name=CHANGZHOU");
    	conn.method(Method.GET);
    	conn.followRedirects(false);
    	Response response = conn.execute();
    	System.out.println(response.cookies());
    	//{referer=deleted, 99a0_city=1, PHPSESSID=b5rjkoq2s2qmukjf9n2ffvjvn5}
    	//立即过期的也显示出了,即从服务器传过来的都显示

 

  99a0_city竟然为1,即选择了第一个作为cookie的值。

 

查看并修改org.jsoup.helper.HttpConnection中获取cookie的代码:

 

            // headers into map
            Map<String, List<String>> resHeaders = conn.getHeaderFields();
            
            for (Map.Entry<String, List<String>> entry : resHeaders.entrySet()) {
                String name = entry.getKey();
                if (name == null)
                    continue; // http/1.1 line

                List<String> values = entry.getValue();

                if (name.equalsIgnoreCase("Set-Cookie")) {
                    for (String value : values) {
                        TokenQueue cd = new TokenQueue(value);
                        String cookieName = cd.chompTo("=").trim();
                        String cookieVal = cd.consumeTo(";").trim();
                        // ignores path, date, domain, secure et al. req'd?
                        System.out.println(cookieName+"="+cookieVal);
                        cookie(cookieName, cookieVal);
                    }
                } else { // only take the first instance of each header
                    if (!values.isEmpty())
                        header(name, values.get(0));
                }
            }

 

 

conn是java.net.HttpURLConnection,也就是说如果使用HttpURLConnection时 有多个同名的cookie 将获取第一个作为cookie的值。

 

2、HttpClient,和浏览器行为一样获取最后一个Cookie:

 

    	HttpClient client = new HttpClient();
    	GetMethod get = new GetMethod("http://www.17sct.com/city.php?ename=CHANGZHOU");
    	get.setFollowRedirects(false);
    	client.executeMethod(get);
    	System.out.println(Arrays.toString(client.getState().getCookies()));
    	//[PHPSESSID=cn74fv516879pv26h5lbaf9gd0, 99a0_city=269]
    	//立即过期的不显示出来
 

 

 

因此总结:

1、使用java.net.HttpURLConnection的工具/框架,如果多个同路径下同名的cookie将获取第一个

2、使用apache HttpClient,和浏览器行为一样获取最后一个。

 

 

因此,当我们在使用cookie时,尽量保证服务器设置一个cookie。

 

 

还要注意:

 

1、使用java.net.HttpURLConnection的工具/框架,可能获取到过期的cookie,如之前的referer[过期时间是2011年,即立即过期];

2、使用apache HttpClient,不会获取到过期的cookie。

 

不知大家遇到类似的问题吗,希望一起探讨。

11
5
分享到:
评论
7 楼 tss0823 2014-08-29  
分析的很好。赞!
6 楼 jinnianshilongnian 2012-09-13  
waitlonely2011 写道
这里httpclient用的get方法是httpclient3里的吧?在httpclient4的httpget方法中如何防止转向?

没研究过 应该是类似的
5 楼 waitlonely2011 2012-09-13  
这里httpclient用的get方法是httpclient3里的吧?在httpclient4的httpget方法中如何防止转向?
4 楼 jinnianshilongnian 2012-08-27  
飞天奔月 写道
对jsoup 也有研究啊

我jsoup  没有用过 cookie


简单用过 内部通过java.net.HttpURLConnection来请求的。
3 楼 飞天奔月 2012-08-27  
对jsoup 也有研究啊

我jsoup  没有用过 cookie

2 楼 jinnianshilongnian 2012-08-22  
snowolf 写道
是个问题。。。。。

嗯  今天在问答频道解答遇到的 很细节。。。。
1 楼 snowolf 2012-08-22  
是个问题。。。。。

相关推荐

Global site tag (gtag.js) - Google Analytics