2012-04-16 15 views
9

ho bisogno di inviare un cookie HTTP, sto usando RestTemplate:RestTemplate e 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); 

Tuttavia, il server ricevente non vede il cookie.

+0

e dove è il codice lato server? - Hai usato uno strumento (come wireshark) per verificare cosa realmente viene inviato al server? – Ralph

+1

Quale 'ClientHttpRequestFactory' ha generato il tuo' RestTemplate'? A seconda della fabbrica, potrebbe esserci un negozio di biscotti che è possibile aggiungere cookie che verranno aggiunti automaticamente alla richiesta. Potrebbe sovrascrivere l'intestazione del set. – yincrash

risposta

20

Il modello di pausa predefinito non utilizza una connessione permanente, ecco cosa utilizzo.

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

Funziona per me! Segna come risposta giusta? – user48956

6

è anche possibile estendere la 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

come è diverso dal codice originale? Penso che la chiave qui, come indicato nella risposta più votata, sia la natura non persistente della connessione HTTP quando si utilizza il normale RestTemplate. –

+0

Il codice originale non impostava il cookie che dovevi impostare ... dal momento che devi definire il cookie con ogni richiesta .. ecco qua. – ticktock

+1

abbastanza giusto. Cambierà il mio downvote. Grazie per la spiegazione. –