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 ResponseExtractor
esta 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.