2016-05-04 12 views
6

Ostatnio natknąłem się na problem, w którym musiałem wykonać żądanie GET do usługi zdalnej (używając prostego apletu, który przypuszczam), i RestTemplate zwrócił Too many redirects!.Spring RestTemplate wykonaj przekierowanie z ciasteczkiem

Po pewnym dochodzeniu wygląda na to, że pierwsze żądanie zgłoszone do określonej usługi zdalnej, w rzeczywistości jest tylko przekierowaniem 302 (do siebie) z niektórymi nagłówkami Set-Cookie. Gdybym używał "normalnej" przeglądarki, potwierdziłby to nagłówek, poprawnie ustawił pliki cookie i podążał za przekierowaniem tam, gdzie powinien spełniać normalną odpowiedź 200.

To, co znalazłem, to że RestTemplate nie akceptuje nagłówka Set-Cookie, więc przekierowanie jest wykonywane wielokrotnie.

Czy jest jakiś sposób, aby RestTemplate potwierdzić nagłówek Set-Cookie dla bieżącego żądania? Najlepiej nie chcę, aby utrzymywał stan, ponieważ RestTemplate jest również używany z innych części systemu.

Pozdrowienia

+0

jest [to] (http://springinpractice.com/2012/04/08/sending-cookies-with-resttemplate), co chcesz zrobić? Również [ten jeden] (http://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies)? – ha9u63ar

+0

@ ha9u63ar Łącza Botht dodaje plik cookie do nagłówka żądania. Najlepiej nie chcę składać 2 oddzielnych wniosków. (1 dla pierwszego zatrzymania przy przekierowaniu, węszeniu nagłówka "Set-Cookie", dodaniu go do drugiego żądania i wykonaniu tego) Chcę, żeby RestTemplate podążał za przekierowaniem (faktycznie to robi już), jednocześnie uznając "Set- Cookie "nagłówek. –

Odpowiedz

6

Wiosna fabrycznym żądanie (SimpleClientHttpRequestFactory) nie obsługuje plików cookie. Wymień go na żądanie z fabryki Apache HttpClient która jest zdolna do ciasteczek:

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

Nie działa z HttpClient 4.3.4. Każdy pomysł pls? –

+0

Tutaj działa nawet z HttpClient 4.3.3. –

0

Lepiej używać najnowszej wersji httpclient. Domyślnie szablon spoczynku sprężyny nie pozwala ustawić nagłówka.

1

Rozwiązałem ten problem w inny sposób niż zrobił to Michał Foksa. (Zanim odpowiedział na to)

Jednym ze sposobów rozwiązania tego problemu jest zaimplementowanie wątku lokalnego cookiemanager i ustawienie go jako domyślnego systemu. Spowoduje to przechowywanie ciasteczek RestTemplate za pomocą cookiemanager i zwolnienie cookiemanager, gdy wątek z prośbą zostanie usunięty.

Pozdrowienia

Powiązane problemy