不同工具(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<String, List<String>> resHeaders = conn.getHeaderFields();  
  3.   
  4. for (Map.Entry<String, List<String>> entry : resHeaders.entrySet()) {  
  5.     String name = entry.getKey();  
  6.     if (name == null)  
  7.         continue// http/1.1 line  
  8.   
  9.     List<String> 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值