2012-04-16 8 views
9

मैं एक HTTP कुकी भेजने की जरूरत है, मैं RestTemplate उपयोग कर रहा हूँ: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

और जहां serverside कोड है? - क्या आपने वास्तव में सर्वर को क्या भेजा है यह सत्यापित करने के लिए एक उपकरण (जैसे वायरशर्क) का उपयोग किया है? – 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; 
    } 
} 
+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

पर्याप्त मेला। मेरा डाउनवोट बदल जाएगा। स्पष्टीकरण के लिए धन्यवाद। –

संबंधित मुद्दे