簡體   English   中英

如果HttpURLConnection與CookieManager自動處理會話cookie?

[英]Should HttpURLConnection with CookieManager automatically handle session cookies?

我有一個Java應用程序(JDK 1.7.0_13),並使用java.net.HttpURLConnection連接到一些基於servlet的服務進行會話管理。 我試圖弄清楚如何使用java.net.CookieManager來跟蹤會話cookie。 閱讀文檔我得到的印象是,使用CookieHandler.setDefault(新的CookieManager())安裝CookieManager會導致cookie管理自動發生。 但是,對同一URL的多個請求似乎不保留cookie。 我是否必須手動從響應中提取cookie並在我自己的請求中重新發送它們,或者CookieManager是否會自動為我執行此操作? 如果CookieManager沒有,那么它添加了什么值?

為了測試一些東西,我有一個servlet,每當我的瀏覽器訪問一個URL時,它都會成功遞增一個計數器。 這可以在Safari,FireFox和Chrome中正常工作......但是,我無法從獨立的Java應用程序中使用它。

這是一個非常簡單的測試程序,用於說明我希望簡單的工作。 它在開始時安裝CookieManager,然后在控制台輸入URL時重復調用fetch(String urlString)方法。

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並使用請求重新發送它們?

我運行你的代碼並替換它

CookieHandler.setDefault(new CookieManager()); 

通過

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

這行得通!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM