作者:核能裸麦_536 | 来源:互联网 | 2023-05-19 01:42
不同工具(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());
-
-
99a0_city竟然为1,即选择了第一个作为COOKIE的值。
查看并修改org.jsoup.helper.HttpConnection中获取COOKIE的代码:
-
- Map> resHeaders = conn.getHeaderFields();
-
- for (Map.Entry> entry : resHeaders.entrySet()) {
- String name = entry.getKey();
- if (name == null)
- continue;
-
- List 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();
-
- System.out.println(COOKIEName+"="+COOKIEVal);
- COOKIE(COOKIEName, COOKIEVal);
- }
- } else {
- 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()));
-
-
因此总结:
1、使用java.net.HttpURLConnection的工具/框架,如果多个同路径下同名的COOKIE将获取第一个;
2、使用apache HttpClient,和浏览器行为一样获取最后一个。
因此,当我们在使用COOKIE时,尽量保证服务器设置一个COOKIE。
还要注意:
1、使用java.net.HttpURLConnection的工具/框架,可能获取到过期的COOKIE,如之前的referer[过期时间是2011年,即立即过期];
2、使用apache HttpClient,不会获取到过期的COOKIE。