2016-05-04 65 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。

問候