Spring RestTemplate遵循cookie重定向

时间:2016-05-04 10:12:08

标签: java spring rest integration resttemplate

最近我遇到了一个问题,我需要向远程服务发出GET请求(使用我假设的简单servlet),RestTemplate返回Too many redirects!

经过一番调查后,似乎第一次向指定的远程服务发出请求,实际上只是一个带有一些Set-Cookie标头的302重定向(自身)。如果我使用的是“普通”浏览器,它会确认标题,正确设置Cookie,并按照重定向进行正常的200响应。

我发现RestTemplate不接受Set-Cookie标题,因此重定向会一遍又一遍地进行。

有没有办法让RestTemplate确认Set-Cookie标题,仅针对当前请求?我最好不要让它保持状态,因为RestTemplate也是从系统的其他部分使用的。

此致

3 个答案:

答案 0 :(得分:8)

Spring默认请求工厂(SimpleClientHttpRequestFactory)不处理cookie。将其替换为具有Apache HttpClient的请求工厂,该工厂可以使用cookie:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

CloseableHttpClient httpClient = HttpClientBuilder
    .create()
    .build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(factory);

答案 1 :(得分:1)

我确实用另一种方式解决了这个问题,而不是Michal Foksa。 (在他回答之前)

解决此问题的一种方法是实现线程本地cookiemanager,并将其设置为系统默认值。这将使RestTemplate存储cookie与cookiemanager,并在请求线程死亡后释放cookiemanager。

此致

答案 2 :(得分:0)

最好使用最新版本的httpclient。默认情况下,弹簧支架模板不允许设置标题。