2010-08-03 8 views
36

मैंने इसे स्वयं हल किया, लेकिन मैंने इतने सरल समाधान की खोज में इतनी देर बिताई, मुझे लगा कि यह यहां दस्तावेज होने के लायक है।स्प्रिंग एमवीसी "रीडायरेक्ट:" उपसर्ग हमेशा http पर रीडायरेक्ट करता है - मैं इसे https पर कैसे बना सकता हूं?

मैं एक InternalResourceViewResolver के साथ एक विशिष्ट स्प्रिंग 3 MVC सेटअप:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

मैं अपने नियंत्रक में एक बहुत सरल हैंडलर विधि है, लेकिन मैं यह और भी इस उदाहरण के लिए सरल बना दिया है:

@RequestMapping("/groups") 
public String selectGroup() { 
    return "redirect:/"; 
} 

समस्या यह है कि, यदि मैं https://my.domain.com/groups पर ब्राउज़ करता हूं, तो मैं रीडायरेक्ट के बाद http://my.domain.com/ पर समाप्त होता हूं। (वास्तविकता में मेरा लोड-बैलेंसर सभी http अनुरोधों को https पर रीडायरेक्ट करता है, लेकिन यह ऐसे लोगों के लिए "आप सुरक्षित कनेक्शन छोड़ रहे हैं/प्रवेश कर रहे हैं" के प्रकार के कई ब्राउज़र अलर्ट का कारण बनते हैं।

तो सवाल यह है कि जब मूल अनुरोध का उपयोग किया जाता है तो क्या वह वसंत को https पर रीडायरेक्ट करने के लिए कैसे मिलता है?

+0

बस का उपयोग कर "अनुप्रेषित:" के बारे में क्या। रीडायरेक्ट के बाद भी एक सापेक्ष यूआरएल का उपयोग करना चाहिए। – qkrijger

उत्तर

46

संक्षिप्त उत्तर, गलत पर InternalResourceViewResolver के redirectHttp10Compatible संपत्ति सेट है:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/" /> 
    <property name="suffix" value=".jsp" /> 
    <property name="redirectHttp10Compatible" value="false" /> 
</bean> 

आप के बजाय एक प्रति अनुरोध के आधार पर ऐसा कर सकता है, स्ट्रिंग के बजाय अपने हैंडलर विधि वापसी देखें होने, और बनाने के द्वारा रीडायरेक्ट स्वयं देखें, और setHttp10Compatible(false) पर कॉल करें।

(यह पता चला है कि अपराधी HttpServletResponse.sendRedirect है, जो RedirectView HTTP 1.0 संगत रीडायरेक्ट के लिए उपयोग करता है, लेकिन अन्यथा नहीं। मुझे लगता है कि इसका मतलब है कि यह आपके सर्वलेट कंटेनर के कार्यान्वयन (?) पर निर्भर है; मैंने दोनों में समस्या देखी टॉमकैट और जेट्टी।)

5

क्या आप निश्चित हैं?

कोड को देखते हुए ऐसा लगता है कि इसमें कोई अंतर नहीं है। दोनों वेरिएंट फोन response.encodeRedirectURL (targetUrl), RedirectView रेखा 388 देखें:

if (http10Compatible) { 
    // Always send status code 302. 
    response.sendRedirect(response.encodeRedirectURL(targetUrl)); 
} 
else { 
    HttpStatus statusCode = getHttp11StatusCode(request, response, targetUrl); 
    response.setStatus(statusCode.value()); 
    response.setHeader("Location", response.encodeRedirectURL(targetUrl)); 
} 

मैं एक ही समस्या थी, लेकिन यह एक loadbalancer पीछे बिल्ला की स्थापना से शुरू हो रहा था। लोडबैंसर एसएसएल हैंडशेक करता है और आगे एक सादे http कनेक्शन को टॉमकैट करता है।

समाधान आपके लोडबलंसर में एक विशेष एचटीपी हेडर भेजना होगा, इसलिए टोमकैट इस कनेक्शन पर "भरोसा" कर सकता है। एक सर्वलेट फ़िल्टर का उपयोग करना चाहिए। प्रतिक्रिया सुनिश्चित करें। फिर प्रतिक्रिया देखने के लिए RedirectView को ओवरराइट करें। सुनिश्चित करें और इसे सही तरीके से संभाल लें।

मैंने इस समाधान को छोटा रखा क्योंकि मुझे यकीन नहीं है कि यह प्रश्न पूछता है या नहीं। यदि आप एक प्रॉक्सी सर्वर के पीछे चल रहे हैं बस अपने application.properties फाइल करने के लिए इन दो गुण जोड़ने

+0

मुझे लगता है कि response.encodeRedirectURL प्रोटोकॉल को स्पर्श नहीं करता है, और यह प्रतिक्रिया.sendRedirect है जो प्रोटोकॉल को http पर सेट कर रहा है। आपका समाधान शायद काम करेगा, लेकिन मेरा आसान है (निश्चित रूप से HTTP/1.0 संगतता की लागत पर)। –

18

स्प्रिंग बूट इस के लिए this nice configuration based solution प्रदान करता है:

server.tomcat.remote_ip_header=x-forwarded-for 
server.tomcat.protocol_header=x-forwarded-proto 

यह मेरे पीछे अन्यथा अपरिवर्तित spring-boot-sample-web-ui लचीला बीनस्टॉक को तैनाती के लिए काम करता है एक https लोड बैलेंसर। इन गुणों के बिना MessageController की लाइन 68 पर रीडायरेक्ट http और hangs के लिए डिफ़ॉल्ट है।

उम्मीद है कि इससे मदद मिलती है।

+0

यदि आपका उपयोग केस उपयोगकर्ता - लोडबैंसर - एप्लिकेशन है तो यह स्वीकार्य समाधान होना चाहिए! –

+0

आप एक से अधिक अपवोट कैसे देते हैं? यह निश्चित रूप से सही औसत है! – simon

+1

धन्यवाद। इससे मेरे ऐप की मदद मिली जो लोड बैलेंसर के पीछे थी। कॉन्फ़िगर पैराम थोड़ा बदल गया है। server.tomcat.remote-ip-header = x-forwarded- server.tomcat.protocol-header = x-forwarded-proto के लिए –

0

अगर आप springmvc उपयोग करते हैं, तो आपको निम्न की कोशिश कर सकते हैं:

modelAndView.setView(new RedirectView("redirect url path", true, false)); 
संबंधित मुद्दे