2012-04-16 50 views
9

は私がRestTemplateを使用している、HTTPクッキーを送信する必要があります。RestTemplateとクッキー

HttpHeaders requestHeaders = new HttpHeaders(); 
requestHeaders.add("Cookie", "SERVERID=c52"); 
HttpEntity requestEntity = new HttpEntity(null, requestHeaders); 
ResponseEntity responses = restTemplate.exchange(webService.getValidateUserUrl(), 
     HttpMethod.POST, requestEntity, String.class, mapValidateUser); 

しかし、受信サーバーがクッキーを見ていません。

+0

とサーバー側のコードがあるの? - 実際にサーバーに送信されているものを確認するツール(wiresharkなど)を使用しましたか? – Ralph

+1

あなたの 'RestTemplate'を生成した' ClientHttpRequestFactory'はどれですか?工場によっては、自動的にリクエストに追加されるクッキーを追加できるクッキーストアが存在する可能性があります。これはあなたのセットヘッダーを無効にするかもしれません。 – yincrash

答えて

20

既定の残りのテンプレートは永続的な接続を使用しません。ここでは私が使用しています。

public class StatefullRestTemplate extends RestTemplate 
{ 
    private final HttpClient httpClient; 
    private final CookieStore cookieStore; 
    private final HttpContext httpContext; 
    private final StatefullHttpComponentsClientHttpRequestFactory statefullHttpComponentsClientHttpRequestFactory; 

    public StatefullRestTemplate() 
    { 
     super(); 
     HttpParams params = new BasicHttpParams(); 
     HttpClientParams.setRedirecting(params, false); 

     httpClient = new DefaultHttpClient(params); 
     cookieStore = new BasicCookieStore(); 
     httpContext = new BasicHttpContext(); 
     httpContext.setAttribute(ClientContext.COOKIE_STORE, getCookieStore()); 
     statefullHttpComponentsClientHttpRequestFactory = new StatefullHttpComponentsClientHttpRequestFactory(httpClient, httpContext); 
     super.setRequestFactory(statefullHttpComponentsClientHttpRequestFactory); 
    } 

    public HttpClient getHttpClient() 
    { 
     return httpClient; 
    } 

    public CookieStore getCookieStore() 
    { 
     return cookieStore; 
    } 

    public HttpContext getHttpContext() 
    { 
     return httpContext; 
    } 

    public StatefullHttpComponentsClientHttpRequestFactory getStatefulHttpClientRequestFactory() 
    { 
     return statefullHttpComponentsClientHttpRequestFactory; 
    } 

} 


public class StatefullHttpComponentsClientHttpRequestFactory extends HttpComponentsClientHttpRequestFactory 
{ 
    private final HttpContext httpContext; 

    public StatefullHttpComponentsClientHttpRequestFactory(HttpClient httpClient, HttpContext httpContext) 
    { 
     super(httpClient); 
     this.httpContext = httpContext; 
    } 

    @Override 
    protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) 
    { 
     return this.httpContext; 
    } 
} 
+0

私のために働く!正解とマークする? – user48956

6

またRestTemplate拡張することができます:

public class CookieRestTemplate extends RestTemplate { 

    @Override 
    protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException { 
    ClientHttpRequest request = super.createRequest(url, method); 

    request.getHeaders().add("Cookie", "SERVERID=c52"); 
    return request; 
    } 

}

+0

これは元のコードとどう違うのですか?私はここで重要なのは、最も投票された答えに記載されているように、通常のRestTemplateを使用する場合のHTTP接続の非永続的性質です。 –

+0

元のコードでは、設定が必要なクッキーが設定されていません...それぞれのリクエストでクッキーを定義する必要があるためです。 – ticktock

+1

かなり十分です。私のdownvoteを変更します。説明ありがとう。 –