web-dev-qa-db-ja.com

CookieManagerを使用したHttpURLConnectionは、セッションCookieを自動的に処理する必要がありますか?

Javaアプリケーション(JDK 1.7.0_13)があり、セッション管理を行うサーブレットベースのサービスに接続するためにJava.net.HttpURLConnectionを使用しています。Javaの使用方法を理解しようとしています。セッションCookieを追跡する.net.CookieManager。ドキュメントを読むCookieHandler.setDefault(new CookieManager())を使用してCookieManagerをインストールすると、Cookie管理が自動的に行われるように思われますが、同じURLへの複数のリクエストは保存されないようですCookie。応答から手動でCookieを抽出し、自分でリクエストに再送信する必要がありますか、CookieManagerは自動的にこれを行いますか?CookieManagerがそうしない場合、どのような価値が追加されますか?

物事をテストするために、ブラウザーが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);
        }
    }

}

このアプリからサーブレットを呼び出すと、明らかにサーバーからセッション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を抽出し、リクエストで再送信する必要がありますか?

27
Chuck

あなたのコードを実行してこれを置き換えます

CookieHandler.setDefault(new CookieManager()); 

沿って

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

うまくいく!

60
pramoth