RestTemplate client with cookies
RestTemplate
has a method in which you can define Interface ResponseExtractor<T>
, this interface is used to obtain the headers of the response, once you have them you could send it back using HttpEntity
and added again.
.add("Cookie", "SERVERID=c52");
Try something like this.
String cookieHeader = null;new ResponseExtractor<T>(){ T extractData(ClientHttpResponse response) { response.getHeaders(); }}
Then
HttpHeaders headers = new HttpHeaders(); headers.add("Cookie", cookieHeader ); ResponseEntity<byte[]> response = restTemplate.exchange("http://example.com/file/123", GET, new HttpEntity<String>(headers), byte[].class);
Also read this post
I've solved the problem by creating an interceptor which stores a cookie and puts it in next requests.
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; }}
Set the interceptor for your RestTemplate:
@Beanpublic RestTemplate restTemplate(RestTemplateBuilder templateBuilder) { return templateBuilder .requestFactory(new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory())) .interceptors(new StatefulRestTemplateInterceptor()) .build();}
Small update to handle sessions in a complete test with 'java.net.HttpCookie' Object.
@Thanks 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 */@Componentpublic class RestTemplateWithCookies extends RestTemplate { private final List<HttpCookie> cookies = new ArrayList<>(); public RestTemplateWithCookies() { } public RestTemplateWithCookies(ClientHttpRequestFactory requestFactory) { super(requestFactory); } public synchronized List<HttpCookie> getCoookies() { return cookies; } public synchronized void resetCoookies() { cookies.clear(); } private void processHeaders(HttpHeaders headers) { final List<String> 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 extends Object> T doExecute(URI url, HttpMethod method, final RequestCallback requestCallback, final ResponseExtractor<T> responseExtractor) throws RestClientException { final List<HttpCookie> 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<T>() { @Override public T extractData(ClientHttpResponse chr) throws IOException { processHeaders(chr.getHeaders()); return responseExtractor.extractData(chr); } }); }}