2016-05-04 36 views
6

最近、私はGET要求をリモートサービス(単純なサーブレットを想定しています)で実行する必要がある問題に遭遇し、RestTemplateがToo many redirects!を返しました。Spring RestTemplateはクッキーでリダイレクトに従います

調査の結果、指定されたリモートサービスに対して最初に行われた要求のようですが、実際にはSet-Cookieヘッダーを持つ302リダイレクト(それ自体)です。 「通常の」ブラウザを使用していた場合、ヘッダーを認識し、正しくCookieを設定し、通常の200応答に合うリダイレクトに従います。

私が見つけたのは、RestTemplateがSet-Cookieヘッダーを受け入れないため、リダイレクトが何度も繰り返されることです。

RestTemplateに現在のリクエストのみのSet-Cookieヘッダーを確認させる方法はありますか? RestTemplateはシステムの他の部分からも使用されるので、私は状態を保持することを望ましくありません。クッキーを処理しない

よろしく

+0

は、あなたが何をしたいのか、[この](http://springinpractice.com/2012/04/08/sending-cookies-with-resttemplate)ですか?また[この1](http://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies)? – ha9u63ar

+0

@ ha9u63ar Bothtリンクは、リクエストヘッダーにクッキーを追加します。私は好ましくは2つの別々の要求をしたくない。 (リダイレクトで最初に停止し、 "Set-Cookie"ヘッダーをスニッフィングして2番目のリクエストに追加してそのリクエストを実行する)RestTemplateがリダイレクトに従うことを望みます。クッキー "ヘッダー。 –

答えて

6

春デフォルト要求工場(SimpleClientHttpRequestFactory)。クッキーが可能であるApacheのHttpClientと要求の工場でそれを置き換えます

import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClientBuilder; 
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; 
import org.springframework.web.client.RestTemplate; 

CloseableHttpClient httpClient = HttpClientBuilder 
    .create() 
    .build(); 
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); 
RestTemplate restTemplate = new RestTemplate(factory); 
+0

HttpClientで動作しない4.3.4。どんなアイデアpls? –

+0

HttpClient 4.3.3でも動作します。 –

0

ベターのHTTPClientの最新バージョンを使用します。デフォルトでは、スプリングレストテンプレートはヘッダーを設定することを許可しません。

1

私はこの問題をMichal Foksaとは別の方法で解決しました。 (彼がこれに答える前に)

解決する1つの方法は、スレッドローカルcookiemanagerを実装し、それをシステムのデフォルトとして設定することです。これにより、RestTemplateはcookiemanagerとCookieを保存し、要求元のスレッドが一度死んだらcookieManagerを解放します。

よろしく

関連する問題