2016-05-04 44 views
6

最近我遇到了一个问题,我需要做一个GET请求远程服务(使用我设想的一个简单的servlet),RestTemplate返回Too many redirects!Spring RestTemplate遵循重定向与Cookie

经过一番调查,似乎对指定远程服务的第一个请求,实际上只是一个302重定向(本身),其中有一些Set-Cookie标头。如果我使用的是“普通”浏览器,它会确认标题,正确设置cookie,然后按照重定向,它应该符合正常的200响应。

我发现的是,RestTemplate不接受Set-Cookie标题,所以重定向一遍又一遍。

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

问候

+0

是[这](http://springinpractice.com/2012/04/08/sending-cookies-with-resttemplate)你想做什么?还[这一个](http://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies)? – ha9u63ar

+0

@ ha9u63ar Botht链接将cookie添加到请求标头。我最好不要提出2个独立的请求。 (1为首先停在重定向,嗅探“Set-Cookie”标题,将它添加到第二个请求并执行那个)我希望RestTemplate遵循重定向(它实际上已经这样做了),同时还确认“Set- Cookie“标题。 –

回答

6

春默认请求工厂(SimpleClientHttpRequestFactory)不处理cookie。与Apache的HttpClient请求工厂,能够饼干进行更换:

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

不适用于HttpClient 4.3.4。有什么想法吗? –

+0

这里甚至可以使用HttpClient 4.3.3。 –

0

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

1

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

解决这个问题的一种方法是实现一个线程本地cookie管理器,并将其设置为系统默认值。这将使RestTemplate使用cookie管理器存储cookie,并且一旦请求线程死了,就释放cookiemanager。

问候