Saltar al contenido

Cliente RestTemplate con cookies

Intenta interpretar el código de forma correcta antes de usarlo a tu proyecto si tquieres aportar algo puedes compartirlo con nosotros.

Solución:

RestTemplate tiene un método en el que puede definir la interfaz ResponseExtractoresta interfaz se utiliza para obtener los encabezados de la respuesta, una vez que los tenga, puede enviarlos de vuelta usando HttpEntity y añadió de nuevo.

 .add("Cookie", "SERVERID=c52");

Prueba algo como esto.

String cookieHeader = null;

new ResponseExtractor()
      T extractData(ClientHttpResponse response) 
        response.getHeaders();
      

Luego

  HttpHeaders headers = new HttpHeaders();
  headers.add("Cookie", cookieHeader );

  ResponseEntity response = restTemplate.exchange("http://example.com/file/123",
      GET,
      new HttpEntity(headers),
      byte[].class);

Lea también esta publicación

Resolví el problema creando un interceptor que almacena una cookie y la coloca en las próximas solicitudes.

public class StatefulRestTemplateInterceptor implements ClientHttpRequestInterceptor 
    private String cookie;

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException 
        if (cookie != null) 
            request.getHeaders().add(HttpHeaders.COOKIE, cookie);
        
        ClientHttpResponse response = execution.execute(request, body);

        if (cookie == null) 
            cookie = response.getHeaders().getFirst(HttpHeaders.SET_COOKIE);
        
        return response;
    

Configure el interceptor para su RestTemplate:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder templateBuilder) 
    return templateBuilder
            .requestFactory(new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory()))
            .interceptors(new StatefulRestTemplateInterceptor())
            .build();

Pequeña actualización para manejar sesiones en una prueba completa con el objeto ‘java.net.HttpCookie’.

@Gracias Shedon

import java.io.IOException;
import java.net.HttpCookie;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.ResponseExtractor;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

/**
 * @link https://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies
 */
@Component
public class RestTemplateWithCookies extends RestTemplate 

    private final List cookies = new ArrayList<>();

    public RestTemplateWithCookies() 
    

    public RestTemplateWithCookies(ClientHttpRequestFactory requestFactory) 
        super(requestFactory);
    

    public synchronized List getCoookies() 
        return cookies;
    

    public synchronized void resetCoookies() 
        cookies.clear();
    

    private void processHeaders(HttpHeaders headers) 
        final List cooks = headers.get("Set-Cookie");
        if (cooks != null && !cooks.isEmpty()) 
            cooks.stream().map((c) -> HttpCookie.parse(c)).forEachOrdered((cook) -> 
                cook.forEach((a) -> 
                    HttpCookie cookieExists = cookies.stream().filter(x -> a.getName().equals(x.getName())).findAny().orElse(null);
                    if (cookieExists != null) 
                        cookies.remove(cookieExists);
                    
                    cookies.add(a);
                );
            );
        
    

    @Override
    protected  T doExecute(URI url, HttpMethod method, final RequestCallback requestCallback, final ResponseExtractor responseExtractor) throws RestClientException 
        final List cookies = getCoookies();

        return super.doExecute(url, method, new RequestCallback() 
            @Override
            public void doWithRequest(ClientHttpRequest chr) throws IOException 
                if (cookies != null) 
                    StringBuilder sb = new StringBuilder();
                    for (HttpCookie cookie : cookies) 
                        sb.append(cookie.getName()).append(cookie.getValue()).append(";");
                    
                    chr.getHeaders().add("Cookie", sb.toString());
                
                requestCallback.doWithRequest(chr);
            

        , new ResponseExtractor() 
            @Override
            public T extractData(ClientHttpResponse chr) throws IOException 
                processHeaders(chr.getHeaders());
                return responseExtractor.extractData(chr);
            
        );
    


Si te sientes suscitado, tienes la libertad de dejar una sección acerca de qué le añadirías a este enunciado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *