2012-05-23 194 views
12

私たちは、ユーザーがCaptchaへの回答を入力する必要のあるAndroidアプリケーションを用意しています。 キャプチャは当社のサーバー上に生成されます。 回答があれば、検証のためにサーバに送信されます。HttpURLConnectionを再利用してセッションを維持する

問題はCaptchaのリクエスト後にHttpURLConnectionを閉じる必要があるため、返信がサーバー上の別のセッションで実行されていることがわかりました。 このため、Captchaチェックはセッションに依存するため失敗します。

接続を維持する方法はありますか、別のパスに従うべきですか? 私は、同等のiPhoneアプリケーションでは、 "接続された"ままで、同じセッションIDを持っていることを知っています。

編集:

CookieManager cookieManager = new CookieManager(); 
    CookieHandler.setDefault(cookieManager); 

    URL urlObj = new URL(urlPath); 
    conn = (HttpURLConnection) urlObj.openConnection(); 

    if (urlPath.toLowerCase().startsWith("https:")) { 
     initializeHttpsConnection((HttpsURLConnection) conn); 
    } 
    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("Content-Language", "en-US"); 
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    conn.setRequestProperty("Content-Length", Integer.toString(bodyData.length)); 
    if (_sessionIdCookie != null) { 
     conn.setRequestProperty("Cookie", _sessionIdCookie); 
    } 
    // Connect 
    conn.setDoInput(true); 
    conn.setDoOutput(true); 
    conn.connect(); 

答えて

13

通常、セッションがhttp接続自体に基づいて保管されていません。それは意味をなさないでしょう。セッションは通常、クライアント側のクッキーとサーバー側のセッション情報を介して生き続ける。 あなたがしなければならないことは、受信したクッキーを保存して、次にそのサーバーに接続するときにクッキーを設定することです。

ドキュメントを読んで、HttpURLConnectionのクラスとのセッションとクッキーの使用方法について詳しく知ることができます。http://developer.android.com/reference/java/net/HttpURLConnection.html

ここであなたが始めるために少し抜粋:

を潜在的に確立し、維持するためには クライアントとサーバー間の長時間のセッションで、HttpURLConnectionには拡張可能なクッキー マネージャが含まれています。 CookieHandlerのと CookieManager使用してVM全体のCookie管理を有効にする:EDIT

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

:APIレベル8以下で働いている人々のために

、あなたがApacheのライブラリを使用する必要があります!

は、ここではいくつかの参照コードです:

// Create a local instance of cookie store 
    CookieStore cookieStore = new BasicCookieStore(); 

    // Create local HTTP context 
    HttpContext localContext = new BasicHttpContext(); 
    // Bind custom cookie store to the local context 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

    HttpGet httpget = new HttpGet("http://www.google.com/"); 

    System.out.println("executing request " + httpget.getURI()); 

    // Pass local context as a parameter 
    HttpResponse response = httpclient.execute(httpget, localContext); 

上記のApacheのライブラリーの例から取られたコード。これは、ここで見つけることができます: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientCustomContext.java

EDIT 2: はそれを明確に作る:あなたは何とか通じていること、接続オブジェクトにクッキー管理オブジェクトの「接続」とあなたがする必要があるApacheのライブラリの

をHttpContextオブジェクト

HttpUrlConnectionの場合、これは必須ではありません。 CookieHandlerの静的メソッドsetDefaultを使用すると、システム全体のcookieHandlerが設定されます。以下はCookieHandler.javaの抜粋です。(Androidのオープンソースプロジェクトの(AOSP)リポジトリから)変数名に注意してください。

37 /** 
38  * Sets the system-wide cookie handler. 
39  */ 
40  public static void setDefault(CookieHandler cHandler) { 
41   systemWideCookieHandler = cHandler; 
42  } 
+0

「CookieManager」を定義したら、セッションIDを保持しているセッションを追加しますか? – theblitz

+0

あなたのために重要な質問があります:API 9+(2.3+)を使用していますか?はいの場合は、接続する前にそれを追加するだけでOKです。 2.2以下を使用している場合は、org.apacheパッケージのHttpClientを使用する必要があります。 2.2の場合は、サンプルコードを追加します。 – DallaRosa

+0

現時点では2.3に設定されていますが、そのように残すかどうかはわかりません。トップ2.2を落とすかもしれないが、確かではない。ここのデバイスの99%が2.3+だから大丈夫だと思う。 – theblitz

11

あなたは

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

一度だけではなく、すべての接続で、この部分を実行する必要がHttpURLConnectionを使用してセッションを維持するために。アプリケーションの起動に良い候補があるApplication.onCreate();

関連する問題