2013-02-13 121 views
24

我有一個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和其他與請求重發呢?

+0

請移動到http://stackoverflow.com/questions/12349266/how-do-i-persist-cookies-when-using-httpurlconnection/32001630#32001630。最好的解決方案已經出現 – hgg 2015-08-14 03:14:39

回答

55

我運行代碼,並替換該

CookieHandler.setDefault(new CookieManager()); 

通過

CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); 

它的工作!

+1

謝謝。精彩的工作。當然,現在我知道答案,文檔很容易找到。 ;-) – Chuck 2013-03-24 15:00:07

+1

這是一個不錯的,更緊湊的答案,你可以找到。謝謝! – Panayotis 2014-02-23 20:18:02