2011-02-14 17 views
5

मुझे एक सर्वलेट या फ़िल्टर क्लास लिखने की आवश्यकता है जो org.apache.catalina.connector.Request ऑब्जेक्ट तक पहुंच प्राप्त कर सकता है, जो मेरे सर्वलेट को दिए गए RequestFacade ऑब्जेक्ट में लपेटा गया है। कास्टिंग काम नहीं करता है, क्योंकि RequestFacade अनुरोध का उप-वर्ग नहीं है।मैं org.apache.catalina.connector.Momcat ऑब्जेक्ट को टोमकैट में कैसे प्राप्त करूं?

कारण मुझे इसकी आवश्यकता है क्योंकि मैं अनुरोध की setRequestedSessionId() विधि को कॉल करने का प्रयास कर रहा हूं, और यह स्पष्ट रूप से एचटीपी सर्वलेट spec का हिस्सा नहीं है। मुझे ऐसा करने का कारण यह है क्योंकि सत्र आईडी को JSESSIONID की तुलना में किसी भिन्न नाम के तहत URL में शामिल किया जा रहा है। मैं यूआरएल या पैरामीटर का नाम नहीं बदल सकता, इसलिए मैं सत्र आईडी निकालने और Request.setRequestedSessionId() पर कॉल करके सही सत्र के साथ अनुरोध को जोड़ने का प्रयास कर रहा हूं।

मैंने वास्तव में वाल्व सबक्लास का उपयोग करके समस्या हल कर ली है, लेकिन मुझे वाल्व का उपयोग करना पसंद नहीं है क्योंकि जहां तक ​​मैं कह सकता हूं, मुझे पैकेजिंग के बजाय टॉमकैट/सर्वर/कक्षा निर्देशिका में अपना वाल्व सबक्लास इंस्टॉल करना होगा यह मेरे बाकी वेबपैप के साथ है। यदि विभिन्न सर्वलेट कंटेनरों में ऐसा करने का एक पोर्टेबल तरीका था, तो यह बहुत अच्छा होगा, लेकिन फिलहाल मुझे इस टोमकैट-विशिष्ट बनाने के लिए इस्तीफा दे दिया गया है।

यहाँ काम कर रहे वाल्व कोड है:

public class SessionSetter extends ValveBase { 
public void invoke(Request request, Response response) throws IOException, ServletException { 
    String sessionId = request.getParameter("whatever"); 
    request.setRequestedSessionId(sessionId); 
} 

}

वहाँ किसी तरह एक सर्वलेट में एक ही बात करते हैं या फिल्टर करने के लिए है? या मेरे आवेदन में वाल्व क्लास को पैकेज करने का कोई तरीका है .war फ़ाइल? http://tomcat.apache.org/tomcat-6.0-doc/config/systemprops.html#Sessions:

+0

तुम क्यों कि क्या ज़रूरत है ? – Bozho

+1

मुझे ऐसा करने की ज़रूरत क्यों है? मैंने सोचा कि मैंने दूसरे पैराग्राफ में कारण बताए हैं, कृपया मुझे बताएं कि मैंने किस भाग को अच्छी तरह से समझाया नहीं है। –

+1

यदि आप टॉमकैट 6 का उपयोग कर रहे हैं तो यह एक विकल्प हो सकता है जिसे आप देख सकते हैं: http://tomcat.apache.org/tomcat-6.0-doc/config/systemprops.html# सत्र। आप सिस्टम गुणों का उपयोग कर सत्र आईडी पैरामीटर के लिए उपयोग किए गए नाम बदल सकते हैं। यह टॉमकैट 7 के लिए उपलब्ध नहीं है, जहां तक ​​मैं कह सकता हूं (मुझे लगता है कि सर्वलेट spec कि टीसी 7 उपकरण नाम बदलने के बारे में कठोर है)। – matt

उत्तर

5

आप बिलाव 5.5 या 6 का उपयोग कर रहे हैं तो यह एक विकल्प अपने आप को देखो सकता है हो सकता है (यह मेरी टिप्पणी का उत्तर करने के लिए उन्नत है)। आप सिस्टम गुणों का उपयोग कर सत्र आईडी पैरामीटर के लिए उपयोग किए गए नाम बदल सकते हैं। यह टॉमकैट 7 के लिए उपलब्ध नहीं है, जहां तक ​​मैं कह सकता हूं (मुझे लगता है कि सर्वलेट spec कि टीसी 7 उपकरण नाम बदलने के बारे में कठोर है)।

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

3

बिलाव भंडार वास्तविक अनुरोधreflection के साथ सुरक्षित चर अनुरोध की RequestFacade, ताकि आप इसे प्राप्त कर सकते हैं (एक सर्वलेट या JSP में) में वस्तु:

import java.lang.reflect.Field; 
import org.apache.catalina.connector.Request; 

... 

Field f = request.getClass().getDeclaredField("request"); 
f.setAccessible(true); // grant access to (protected) field 
Request realRequest = (Request)f.get(request); 
+0

नोट यह सेट नहीं होगा यदि जावा सुरक्षा प्रबंधक सेट को अक्षम करने के लिए मौजूद है। –

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

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