Java SpringRESTTemplate跟随cookie重定向

Java SpringRESTTemplate跟随cookie重定向,java,spring,rest,integration,resttemplate,Java,Spring,Rest,Integration,Resttemplate,最近我遇到了一个问题,我需要对远程服务执行GET请求(我想是使用一个简单的servlet),RestTemplate返回了太多的重定向 经过一些调查,似乎向指定的远程服务发出的第一个请求实际上只是一个302重定向(到自身),带有一些Set Cookie头。如果我使用的是“普通”浏览器,它会确认标题,正确设置cookies,并遵循重定向,在那里它应该满足正常的200响应 我发现RestTemplate不接受Set Cookie头,因此重定向会被反复执行 是否有任何方法使RestTemplate仅对

最近我遇到了一个问题,我需要对远程服务执行
GET
请求(我想是使用一个简单的servlet),RestTemplate返回了太多的重定向

经过一些调查,似乎向指定的远程服务发出的第一个请求实际上只是一个302重定向(到自身),带有一些
Set Cookie
头。如果我使用的是“普通”浏览器,它会确认标题,正确设置cookies,并遵循重定向,在那里它应该满足正常的200响应

我发现RestTemplate不接受
Set Cookie
头,因此重定向会被反复执行

是否有任何方法使RestTemplate仅对当前请求确认
Set Cookie
头?我最好不要让它保持状态,因为RestTemplate也是从系统的其他部分使用的


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);

最好使用最新版本的httpclient。默认情况下,spring rest模板将不允许设置标题。

我确实用Michal Foksa没有用的另一种方法解决了这个问题。(在他回答之前)

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


你想做什么?另外?@ha9u63ar Botht links向请求头添加cookie。我最好不想提出两个单独的要求。(1)对于第一次在重定向处停止,嗅探“Set Cookie”头,将其添加到第二个请求并执行该请求)我希望RestTemplate在确认“Set Cookie”头的同时遵循重定向(它实际上已经这样做了)。