2012-04-16 23 views
9

tôi cần phải gửi một cookie, Tôi đang sử dụng RestTemplate:RestTemplate và Cookie

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); 

Tuy nhiên, máy chủ tiếp nhận không nhìn thấy các tập tin cookie.

+0

và ở đâu là mã serverside? - Bạn đã sử dụng một công cụ (như wireshark) để xác minh những gì thực sự gửi đến máy chủ? – Ralph

+1

'ClientHttpRequestFactory' nào tạo ra' RestTemplate' của bạn? Tùy thuộc vào nhà máy, có thể có một cửa hàng cookie mà bạn có thể thêm cookie vào đó sẽ tự động được thêm vào yêu cầu của bạn. Điều này có thể ghi đè tiêu đề đã đặt của bạn. – yincrash

Trả lời

20

Mẫu khôi phục mặc định không sử dụng kết nối liên tục, dưới đây là những gì tôi sử dụng.

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

Làm việc cho tôi! Đánh dấu là câu trả lời đúng? – user48956

6

Bạn cũng có thể kéo dài tuổi 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

khác với mã ban đầu như thế nào? Tôi nghĩ rằng chìa khóa ở đây là, như đã nêu trong câu trả lời được bình chọn nhiều nhất, bản chất không liên tục của kết nối HTTP khi sử dụng RestTemplate thông thường. –

+0

Mã ban đầu đã không đặt cookie bạn cần thiết ... vì bạn phải xác định cookie với mỗi yêu cầu .. ở đây ya go. – ticktock

+1

đủ công bằng. Sẽ thay đổi downvote của tôi. Cảm ơn lời giải thích. –

Các vấn đề liên quan