2012-06-15 9 views
16

मैं अपने ऐप के संदर्भ में टॉमकैट स्वचालित रूप से एक पिछला स्लैश जोड़ना चाहता हूं यदि यूआरएल इसके बिना दर्ज किया गया हो।टोमकैट वेब ऐप के संदर्भ में पीछे की ओर स्लैश नहीं जोड़ रहा है

जब मैं जेटी के साथ परीक्षण करता हूं, तो यह स्वचालित रूप से मेरे ऐप के संदर्भ में पिछली स्लैश जोड़ता है, लेकिन टॉमकैट ऐसा नहीं करता है।

मुझे अनिश्चितता है कि संदर्भ को एक बार तैनात किया जाएगा, क्योंकि मैं किसी और को युद्ध बंद कर रहा हूं, इसलिए HTML में कोई संसाधन संदर्भ सभी रिश्तेदार हैं। क्या टॉमकैट को रीयलिंग स्लैश के साथ स्वचालित रूप से उसी संदर्भ में रीडायरेक्ट करने का कोई तरीका है?

वर्तमान में स्प्रिंग 3.

+0

वास्तव में क्या आप के उदाहरण जोड़ें करना चाहते हैं, और स्पष्ट करें कि स्लैश की आवश्यकता क्यों है? –

+0

मूल रूप से मुझे 'http: // url.com/context' load' http: // url.com/context/' टॉमकैट सभी डेमो अनुप्रयोगों के लिए पिछला स्लैश जोड़ना होगा, लेकिन मेरे लिए नहीं। जब मैं जेटी के साथ ऐप चलाता हूं, तो पिछला स्लैश स्वचालित रूप से भी जोड़ा जाता है। स्लैश की आवश्यकता है 'संदर्भ/संसाधन /' में छवि, सीएसएस, जेएस आदि है और वे HTML में सापेक्ष पथ का उपयोग कर रहे हैं, इसलिए उदाहरण के लिए 'src =" resource/image.jpg "'। – Badweather

उत्तर

26

यह एक पुरानी पोस्ट है, लेकिन बिलाव 7.0.67 के रूप में, आप अपने context.xml फ़ाइल में निम्न विशेषता जोड़ने की जरूरत:

:

<Context mapperContextRootRedirectEnabled="true">...</Context> 

7.0.67 changelog के अनुसार

कार्यक्षमता को ले जाएं जो संदर्भ जड़ें और निर्देशिकाओं के लिए रीडायरेक्ट प्रदान करता है जहां मैपर से डिफ़ॉल्ट सर्विलेट में पीछे/जोड़ा जाता है। यह रीडायरेक्ट किए जाने से पहले किसी भी कॉन्फ़िगर किए गए वाल्व और फ़िल्टर द्वारा ऐसे अनुरोधों को संसाधित करने में सक्षम बनाता है। यह व्यवहार MapperContextRootRedirectEnabled और संदर्भ के MapperDirectoryRedirectEnabled विशेषताओं के माध्यम से कॉन्फ़िगर करने योग्य है जिसका उपयोग पिछले व्यवहार को पुनर्स्थापित करने के लिए किया जा सकता है।

और बिलाव संदर्भ documentation में:

mapperContextRootRedirectEnabled: सक्षम होने पर, एक वेब अनुप्रयोग संदर्भ जड़ के लिए अनुरोध पुनः निर्देशित किया जाएगा यदि आवश्यक हो तो डिफ़ॉल्ट सर्वलेट मैपर बजाय द्वारा (स्लैश जोड़ने) । यह अधिक कुशल है लेकिन इसका पुष्टि करने का साइड इफेक्ट है कि संदर्भ पथ मौजूद है। यदि निर्दिष्ट नहीं है, तो गलत का डिफ़ॉल्ट मान उपयोग किया जाता है।

+0

स्नीकी टोमकैट! मैंने बस अपने पूरे ऐप के साथ क्या गलत था यह जानने की कोशिश में दो पूरे दिन बर्बाद कर दिया! सबक जारी: अगर सब कुछ विफल रहता है, आरटीएफएम! –

+0

यह मेरी जिंदगी बचाता है, मुझे लगता है कि mapperContextRootRedirectEnabled का डिफ़ॉल्ट मान सत्य है, इसलिए आपको उन्हें जोड़ने की आवश्यकता नहीं है। –

+2

हां, डिफ़ॉल्ट को "सत्य" में बदल दिया गया है क्योंकि 7.0.68 – Pat

0

साथ बिलाव 7 का उपयोग करके आप बिलाव पर URL पुनर्लेखन के साथ खेल की कोशिश की?
यह मदद कर सकता है: http://code.google.com/p/urlrewritefilter/

अगर वह मदद नहीं करता है, इस पर एक नज़र डालें: URL rewrite in tomcat web.xml

5

बिलाव स्लैश स्वचालित रूप से कहते हैं। बस टॉमकैट के साथ प्रदान किए गए उदाहरण एप्लिकेशन के साथ इसका परीक्षण करें ..

यदि - कुछ विशेष कॉन्फ़िगरेशन के कारण - ऐसा नहीं होता है, तो मैं एक फ़िल्टर लिखता हूं जो क्वेरी स्ट्रिंग की जांच करता है और एप्लिकेशन द्वारा आवश्यक रीडायरेक्ट करता है। कई बार इसकी आवश्यकता होती है (http-> https पुनर्निर्देशन आदि)

+0

आप सही हैं, टॉमकैट इन्हें स्वचालित रूप से जोड़ता है। मुझे यह पता लगाने की जरूरत है कि यह मेरे आवेदन में क्यों अक्षम किया जा रहा है। – Badweather

+0

क्या टॉमकैट के सामने कोई अन्य सर्वर है? अपाचे, nginx, आदि? वे गड़बड़ी कर सकते हैं .. –

+0

वास्तव में, इसके सामने एक rproxy सर्वर मेरे लिए पीछे स्लैश जोड़कर इस मुद्दे को ठीक करने में सक्षम है। मेरा मानना ​​है कि इस मुद्दे को स्प्रिंग एमवीसी के साथ एक वैध यूआरएल के रूप में पिछली स्लैश के बिना मेरे संदर्भ को स्वीकार करना है। – Badweather

6

ऐसा लगता है कि आपके एप्लिकेशन के web.xml में "/*" पर मैपिंग है। "/*" पर एक सर्वलेट-मैपिंग का कारण वेब एप्लिकेशन के लिए अनुरोध को पास करने के लिए टोमकैट का कारण बनता है (यानी रीडायरेक्ट नहीं होता है)।

ठीक से पुनर्निर्देशित करने के लिए, आपको "/*" मैपिंग को केवल "/" पर बदलना होगा, बाद वाला डिफ़ॉल्ट डिफ़ॉल्ट है।

+1

+1 मेरे मामले में, मैंने वसंत सुरक्षा को '/ *' को रोकने के लिए कॉन्फ़िगर किया है। क्या पिछली स्लैश जोड़ने के लिए स्प्रिंग सिक्योरिटी में कोई कॉन्फ़िगरेशन उपलब्ध है? – manikanta

0

पैट के उत्कृष्ट उत्तर ने मुझे इस पर कुछ और जानकारी खोदने में मदद की। ऐसा लगता है कि यह टॉमकैट के कुछ संस्करणों (7.0.67+ पर टॉमकैट 7, और टॉमकैट 8 8.2 9 और 8.37 के बीच) में कुछ कर्क से संबंधित है, जिसमें सत्र कुकीज़ और यूआरएल रीडायरेक्शन के साथ किया जाता है।

नीचे की रेखा यह प्रतीत होती है कि यदि जावा सर्वर अंत में स्लैश के साथ पथ-विशिष्ट सत्र कुकीज़ बनाता है (जैसे "/ app_name /"), तो सर्वर को स्वचालित प्रारंभिक रीडायरेक्ट (/ app_name - ->/app_name /) ... अन्यथा, सत्र कुकी अनुरोध के साथ नहीं भेजी जाएगी, और यह सर्वर पर कभी भी दिखेगा जैसे आपके पास वैध सत्र है। ऐप से प्रमाणीकरण में रीडायरेक्ट लूप का कारण बन सकता है।

बिलाव में विन्यास है कि दोनों व्यवहारों को नियंत्रित कर रहे हैं, लेकिन जहाँ तक मैं बता सकता हूँ, वे अनिवार्य रूप से थे बाहर के सिंक इन संस्करणों में, इस तरह के स्लैश कि एक साथ कुकी मिल सकता है, बिना रीडायरेक्ट प्राप्त करना। कई संबंधित मुद्दों/बिलाव बदलाव का में परिवर्तन होते हैं: https://tomcat.apache.org/tomcat-8.0-doc/changelog.html

पैट पहले ही उल्लेख किया गया है, इस लिए आपके ऐप की संदर्भ तत्व को यह विशेषता जोड़कर हल हो गई है:

<Context mapperContextRootRedirectEnabled="true"> 
संबंधित मुद्दे