2016-05-04 16 views
6

के साथ रीडायरेक्ट का पालन करें हाल ही में मैंने एक समस्या में भाग लिया जहां मुझे GET रिमोट सेवा (एक सरल सर्वलेट का उपयोग करके) करने का अनुरोध करने की आवश्यकता थी, और RestTemplate Too many redirects! लौटा।स्प्रिंग रेस्ट टेम्पलेट कुकी

कुछ जांच के बाद, यह निर्दिष्ट दूरस्थ सेवा के लिए पहले अनुरोध की तरह लगता है, वास्तव में कुछ Set-Cookie हेडर के साथ वास्तव में केवल 302-रीडायरेक्ट (स्वयं के लिए) है। अगर मैं "सामान्य" ब्राउज़र का उपयोग कर रहा था, तो यह हेडर को स्वीकार करेगा, कुकीज़ को सही तरीके से सेट करेगा, और रीडायरेक्ट का पालन करेगा जहां इसे सामान्य 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 बोल्ट लिंक अनुरोध हेडर पर एक कुकी जोड़ता है। मैं अधिमानतः 2 अलग-अलग अनुरोध नहीं करना चाहता हूं। (रीडायरेक्ट पर पहली बार रोकना, "सेट-कुकी" हेडर को स्नीफ करना, इसे दूसरे अनुरोध में जोड़ना और उसे निष्पादित करना) मैं रीस्ट टेम्पलेट को रीडायरेक्ट का पालन करना चाहता हूं (यह वास्तव में यह पहले से ही करता है) जबकि "सेट- कुकी "हेडर। –

उत्तर

6

स्प्रिंग डिफ़ॉल्ट अनुरोध कारखाने (SimpleClientHttpRequestFactory) कुकीज़ संभाल नहीं करता है। अपाचे 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

एचटीपी क्लाइंट 4.3.4 के साथ काम नहीं कर रहा है। कोई विचार pls? –

+0

यहां यह HttpClient 4.3.3 के साथ भी काम करता है। –

0

बेहतर httpclient के नवीनतम संस्करण का उपयोग करने के। डिफ़ॉल्ट रूप से वसंत शेष टेम्पलेट हेडर सेट करने की अनुमति नहीं देगा।

1

मैंने इस समस्या को माइकल फोकसा की तुलना में किसी अन्य तरीके से हल किया। (इससे पहले कि उसने इसका उत्तर दिया)

इसे हल करने का एक तरीका एक थ्रेड-स्थानीय cookiemanager को लागू करना है, और इसे सिस्टम डिफ़ॉल्ट के रूप में सेट करना है। यह cookiemanager के साथ RestTemplate स्टोर कुकीज़ बना देगा, और अनुरोध थ्रेड मरने के बाद cookiemanager को छोड़ देगा।

सादर

संबंधित मुद्दे