热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

不同工具(jsoup、httpclient)获取多个同路径下同名Cookie的问题这两天在iteye的问答中有一个【java中使用jsou

不同工具(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

 

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

 

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

 

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

 

Java代码   收藏代码
  1. // headers into map  
  2. Map> resHeaders = conn.getHeaderFields();  
  3.   
  4. for (Map.Entry> entry : resHeaders.entrySet()) {  
  5.     String name = entry.getKey();  
  6.     if (name == null)  
  7.         continue// http/1.1 line  
  8.   
  9.     List values = entry.getValue();  
  10.   
  11.     if (name.equalsIgnoreCase("Set-COOKIE")) {  
  12.         for (String value : values) {  
  13.             TokenQueue cd = new TokenQueue(value);  
  14.             String COOKIEName = cd.chompTo("=").trim();  
  15.             String COOKIEVal = cd.consumeTo(";").trim();  
  16.             // ignores path, date, domain, secure et al. req'd?  
  17.             System.out.println(COOKIEName+"="+COOKIEVal);  
  18.             COOKIE(COOKIEName, COOKIEVal);  
  19.         }  
  20.     } else { // only take the first instance of each header  
  21.         if (!values.isEmpty())  
  22.             header(name, values.get(0));  
  23.     }  
  24. }  

 

 

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

 

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

 

Java代码   收藏代码
  1. HttpClient client = new HttpClient();  
  2. GetMethod get = new GetMethod("http://www.17sct.com/city.php?ename=CHANGZHOU");  
  3. get.setFollowRedirects(false);  
  4. client.executeMethod(get);  
  5. System.out.println(Arrays.toString(client.getState().getCOOKIEs()));  
  6. //[PHPSESSID=cn74fv516879pv26h5lbaf9gd0, 99a0_city=269]  
  7. //立即过期的不显示出来  
 

 

 

因此总结:

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

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

 

 

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

 

 

还要注意:

 

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

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


推荐阅读
author-avatar
核能裸麦_536
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有