2012-04-16 2 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

어떤'ClientHttpRequestFactory'가'RestTemplate'을 생성 했습니까? 공장에 따라 자동으로 요청에 추가되는 쿠키를 추가 할 수있는 쿠키 저장소가있을 수 있습니다. 이 설정 헤더를 무시할 수 있습니다. – 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; 
    } 
} 
당신은 또한 RestTemplate 확장 할 수 있습니다
+0

저를 위해 일하십시오! 정답으로 표시 하시겠습니까? – user48956

6

:

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 변경됩니다. 설명 해줘서 고마워. –