2012-04-16 13 views
9

que necesitan enviar una cookie de HTTP, estoy usando RestTemplate:RestTemplate y 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); 

Sin embargo, el servidor de recepción no ve la cookie.

+0

y dónde está el código serverside? - ¿Has usado una herramienta (como wireshark) para verificar lo que realmente se envía al servidor? – Ralph

+1

¿Qué 'ClientHttpRequestFactory' generó su' RestTemplate'? Dependiendo de la fábrica, podría haber una tienda de cookies a la que pueda agregarle cookies que se agregará automáticamente a su solicitud. Esto podría estar anulando tu encabezado de conjunto. – yincrash

Respuesta

20

La plantilla de reposo predeterminada no usa una conexión persistente, esto es lo que uso.

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

¡Funciona para mí! Marcar como la respuesta correcta? – user48956

6

También puede extender el 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

¿cómo es esto diferente del código original? Creo que la clave aquí es, como se indica en la respuesta más votada, la naturaleza no persistente de la conexión HTTP cuando se utiliza RestTemplate regular. –

+0

El código original no configuró la cookie que necesitaba establecer ... ya que debe definir la cookie con cada solicitud ... aquí ya está. – ticktock

+1

es suficiente. Cambiaré mi voto negativo. Gracias por la explicación. –

Cuestiones relacionadas