這兩天在iteye的問答中有一個【 java中使用jsoup獲取cookies 】問題, 地址: http://www.iteye.com/problems/87415 。
?
不知大家遇到類似的問題嗎,希望一起探討。
1、首先第一次訪問http://www.17sct.com/city.php?ename=CHANGZHOU,我們可以看到如下請求:
我們看到 設(shè)置了兩個 99a0_city cookie, 值分別為1 和 269;如chrome、firefox、ie8將選擇最后一個作為cookie值。
?
好像沒什么問題,接下來繼續(xù)看兩個工具:
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} //立即過期的也顯示出了,即從服務(wù)器傳過來的都顯示
?
? 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] //立即過期的不顯示出來?
?
?
因此總結(jié):
1、使用java.net.HttpURLConnection的工具/框架, 如果多個同路徑下同名的cookie將獲取第一個 ;
2、使用apache?HttpClient, 和瀏覽器行為一樣獲取最后一個。
?
?
因此,當(dāng)我們在使用cookie時,盡量保證服務(wù)器設(shè)置一個cookie。
?
?
還要注意:
?
1、使用java.net.HttpURLConnection的工具/框架, 可能獲取到過期的cookie,如之前的referer[過期時間是2011年,即立即過期];
2、使用apache?HttpClient, 不會獲取到過期的cookie。
?
不知大家遇到類似的問題嗎,希望一起探討。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
