1

プロジェクトで Spring for Android を使用しており、Cookie ストア/マネージャーを管理する必要があります。の実装を使用して任意のリクエストに Cookie を追加できますがClientHttpRequestInterceptor、リクエストを送信するときにこれらの一部を削除したいと考えています。

より具体的に言うと、私が直面している問題は、Froyo の場合、Spring(with で) 固有の実装が、ヘッダーに明示的にヘッダーを設定している場合でもDefaultHttpClient、Cookie を自動的に追加することです。CookieStoreしかし、これらの Cookie を自分で管理したいと考えています (一部を削除するか、値を更新します)。上記のジンジャーブレッドの場合(Spring実装は で行われますHttpURLConnection)、Cookieは自分で行っている場合にのみ追加されます-ただし、Springの設定が表示されないため、わかりませんが、最終的CookieHandlerにはそれらが表示されないということですリクエストを実行するとき、またはそれらが更新されているのを見ることができます。したがって、問題は Froyo に固有のものです。

回避策は、接続ファクトリをリセットすることです。何かのようなもの:

protected void resetCookieStoreForTemplate(RestTemplate template) {
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
        template.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
    }
}

その下では、DefaultHttpClient を再作成しているようで、新しいCookieStore. しかし、それは私には少し醜いようです。

最後に、私の質問は次のとおりSpring for Androidです。Cookie 管理用の API を公開する方法はありますか? RestTemplateがコネクティビティ、コネクション ファクトリ、メッセージ コンバーターなどの抽象化を公開するのと同じように、Cookie 管理の抽象化があれば非常に嬉しく思います。

4

2 に答える 2

2

私は Spring を自分で使用したことはありませんが、Spring について読んだところによると、公式のアドバイスに従っており、API バージョンに基づいて HTTP クライアントを切り替えます (これは、私の好みに合わせて真剣に設計しすぎたとしても、非常に巧妙です)。を使用する場合HTTPUrlConnection、おっしゃったように、Spring はおそらくCookieHandler. メモリ内の Cookie 処理が表示されるはずなので、同じアプリの実行中の要求に対してすべてが機能するはずですが、アプリを閉じると Cookie は消去されます。これがあなたが見ているものであることを確認できますか?

その場合は、新しいインスタンスを作成し、それにカスタムをCookieManager渡し、デフォルトを使用するだけです。CookieStorenullCookiePolicy

永続ストアが組み込まれていないのは残念ですが、それを作成することも特に難しくありません。

編集:使用するCookieStoreについては、こちらSharedPreferencesを参照してください(自分でテストしていません)。

于 2013-07-23T22:05:24.243 に答える
1

このClientHttpRequestInterceptorクラスは、コンテンツ タイプや承認などの設定など、すべてのリクエストに共通のヘッダーを渡す必要がある場合に適した方法です。私が理解している限り、特定のリクエストに対していくつかの Cookie 値を渡したいと考えています。クラスを介してこれを達成することもできますHttpEntityHttpHeaders

    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.add("Cookie", "name=" + value);
    HttpEntity requestEntity = new HttpEntity(null, requestHeaders);
    ResponseEntity response = restTemplate.exchange(
      "http://server/service?...",
      HttpMethod.GET,
      requestEntity,
      Response.class);

Spring rest テンプレートは、Cookie を管理するためのオフ セルフ ソリューションを提供しません。このクラスCookieHandlerは、Spring の一部ではなく、Apache によって提供されます。REST テンプレートは、Spring Core と比較して、リクエスト応答を管理するための基本的なソリューションにすぎません。

于 2013-07-24T08:42:19.550 に答える