2016-05-04 16 views
6

Recentemente mi sono imbattuto in un problema in cui avevo bisogno di fare una richiesta GET a un servizio remoto (utilizzando un servlet semplice presumo), e RestTemplate restituito Too many redirects!.Spring RestTemplate segue reindirizzamento con cookie

Dopo alcune indagini, sembra che la prima richiesta fatta al servizio remoto specificato sia in realtà solo un 302-reindirizzamento (a se stesso) con alcune intestazioni Set-Cookie. Se stavo usando un browser "normale", confermerebbe l'intestazione, impostò i cookie correttamente e seguirà il reindirizzamento dove dovrebbe incontrare una normale risposta 200.

Quello che ho trovato è che RestTemplate non accetta l'intestazione Set-Cookie, quindi il reindirizzamento viene ripetuto più e più volte.

Esiste un modo per consentire a RestTemplate di riconoscere l'intestazione Set-Cookie, solo per la richiesta corrente? Preferibilmente non voglio che mantenga lo stato, poiché il RestTemplate viene usato anche da altre parti del sistema.

saluti

+0

IS [questo] (http://springinpractice.com/2012/04/08/sending-cookies-with-resttemplate) Che cosa si vuole fare? Anche [questo] (http://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies)? – ha9u63ar

+0

@ ha9u63ar I collegamenti di Botht aggiungono un cookie all'intestazione della richiesta. Preferibilmente non voglio fare 2 richieste separate. (1 per il primo arresto al reindirizzamento, annusando l'intestazione "Set-Cookie", aggiungendolo alla seconda richiesta ed eseguendo quello) Voglio che RestTemplate segua il reindirizzamento (in realtà lo fa già) mentre riconosce anche "Set- Cookie "intestazione. –

risposta

6

Primavera richiesta di default (SimpleClientHttpRequestFactory) non gestisce i cookie. Sostituirla con una fabbrica di richiesta con Apache HttpClient che è in grado di biscotti:

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

Non funziona con HttpClient 4.3.4. Qualche idea? –

+0

Qui funziona anche con HttpClient 4.3.3. –

0

meglio utilizzare la versione più recente di HttpClient. Di default il modello di riposo a molla non consente di impostare l'intestazione.

1

Ho risolto questo problema in un modo diverso rispetto a Michal Foksa. (Prima di rispondere a questo messaggio)

Un modo per risolverlo è implementare un cookiemanager thread-local e impostarlo come predefinito di sistema. In questo modo il RestTemplate memorizza i cookie con il cookiemanager e rilascia il cookiemanager una volta che il thread richiedente è morto.

saluti

Problemi correlati