2013-02-13 20 views
24

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

テストするには、ブラウザが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が取得されます。要約する

ので
> 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が私のために自動的に動作させるために何かをしなければならないか、または私は手動で応答からクッキーを抽出し、リクエストでそれらを再送信するために頼らなければならないのですか?

+0

http://stackoverflow.com/questions/12349266/how-do-i-persist-cookies-when-using-httpurlconnection/32001630#32001630に移動してください。最高の解決策が生まれました。 – hgg

答えて

55

私はあなたのコードを実行し、それが仕事

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

することにより、この

CookieHandler.setDefault(new CookieManager()); 

を交換してください!

+1

ありがとうございました。素晴らしい作品。もちろん、私が答えを知ったので、ドキュメンテーションは簡単に見つけることができます。 ;-) – Chuck

+1

これは、あなたが通常見つけることができるものよりも、すてきでコンパクトな答えです。ありがとう! – Panayotis

関連する問題