最近我遇到了一个问题,我需要向远程服务发出GET
请求(使用我假设的简单servlet),RestTemplate返回Too many redirects!
。
经过一番调查后,似乎第一次向指定的远程服务发出请求,实际上只是一个带有一些Set-Cookie
标头的302重定向(自身)。如果我使用的是“普通”浏览器,它会确认标题,正确设置Cookie,并按照重定向进行正常的200响应。
我发现RestTemplate不接受Set-Cookie
标题,因此重定向会一遍又一遍地进行。
有没有办法让RestTemplate确认Set-Cookie
标题,仅针对当前请求?我最好不要让它保持状态,因为RestTemplate也是从系统的其他部分使用的。
此致
答案 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。默认情况下,弹簧支架模板不允许设置标题。