我有一個Java應用程序(JDK 1.7.0_13),並使用java.net.HttpURLConnection連接到一些基於servlet的會話管理服務。我想弄清楚如何使用java.net.CookieManager來跟蹤會話cookie。閱讀文檔時,我得到的結論是,使用CookieHandler.setDefault(新的CookieManager())安裝CookieManager應該會自動發生Cookie管理。但是,對同一個URL的多個請求似乎不能保存cookie。我是否必須手動從響應中提取Cookie,並在我自己的請求中重新發送它們,或者CookieManager會自動爲我執行此操作?如果CookieManager沒有,那麼它增加了什麼價值?應該使用CookieManager的HttpURLConnection自動處理會話cookie?
爲了測試事情,我有一個servlet,每當我的瀏覽器訪問一個URL時,就會成功遞增一個計數器。這在Safari,FireFox和Chrome中運行良好......但是,我無法從獨立的Java應用程序中使用它。
這裏有一個非常簡單的測試程序來說明我希望簡單的工作。它在開始時安裝CookieManager,然後重複調用fetch(String urlString)方法,因爲在控制檯中輸入了URL。
package com.brilliant.experimental;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpFetcher {
public static void fetch(String urlString) {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
InputStream in = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
int status = conn.getResponseCode();
System.out.println("Status = " + status);
String key;
System.out.println("Headers-------start-----");
for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) {
System.out.println(key + ":" + conn.getHeaderField(i));
}
System.out.println("Headers-------end-----");
System.out.println("Content-------start-----");
String inputLine;
while ((inputLine = reader.readLine()) != null) {
System.out.println(inputLine);
}
System.out.println("Content-------end-----");
in.close();
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) {
CookieHandler.setDefault(new CookieManager());
for (int i = 0; i < args.length; i++) {
fetch(args[i]);
}
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(isr);
String prompt = "> ";
String urlString;
try {
for (System.out.print(prompt);
(urlString = reader.readLine()) != null;
System.out.print(prompt))
{
fetch(urlString);
}
} catch (IOException ioe) {
System.out.println(ioe);
}
}
}
從這個應用程序調用我的servlet很明顯從服務器獲取會話cookie。但是,再次調用會獲取新的會話cookie。
> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaMp0uKke4gp9_-nUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:31 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----
> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaZ-oPaC1I9WdEDoUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:33 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----
因此,要總結,我必須做別的事情,使CookieManager自動爲我工作的,還是我不得不求助於從響應手動提取Cookie和其他與請求重發呢?
請移動到http://stackoverflow.com/questions/12349266/how-do-i-persist-cookies-when-using-httpurlconnection/32001630#32001630。最好的解決方案已經出現 – hgg 2015-08-14 03:14:39