2011-08-20 9 views
5

मुझे जावा में HttpSession के अपने संस्करण को लागू करने की आवश्यकता होगी। मुझे बहुत कम जानकारी मिली है जो बताती है कि इस तरह की उपलब्धि कैसे प्राप्त होती है।जावा में कस्टम http सत्र को कैसे कार्यान्वित करें?

मुझे लगता है कि मेरी समस्या है - मैं मौजूदा एचटीपीशन को कैसे ओवरराइड कर सकता हूं चाहे अनुप्रयोग सर्वर के कार्यान्वयन से कोई फर्क नहीं पड़ता? http://java.sun.com/developer/technicalArticles/Servlets/ServletControl/

क्या कोई अन्य तरीके हैं -

मैं एक गुणवत्ता बल्कि पुराने पढ़ा जो मुझे मेरे लक्ष्य को प्राप्त करने में मदद करता है के पार चला था?

+6

AFAIK, यह संभव नहीं है। जेईई स्पेक यह जरूरी नहीं है कि एचटीपीएसशन कार्यान्वयन बदला जा सके। लेकिन मुख्य सवाल यह है कि आप ऐसा क्यों करना चाहते हैं? –

+0

यह सुनिश्चित नहीं है कि आपको इसे कार्यान्वित करने के तरीके की आवश्यकता है, लेकिन यह जांचें http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial- सत्र- ट्रैकिंग।एचटीएमएल – eon

+0

आपको ऐसा करने की ज़रूरत है कि आपको लगता है कि आपको HttpSession को कार्यान्वित करने की आवश्यकता है? – CrackerJack9

उत्तर

4

एक नया वर्ग बनाएँ, और HttpSession लागू:

public class MyHttpSession implements javax.servlet.http.HttpSession { 

    // and implement all the methods 

} 

अस्वीकरण: मैं अपने आप को इस परीक्षण नहीं किया:

फिर से/* एक यूआरएल-पैटर्न के साथ एक फिल्टर लिख सकते हैं और HttpServletRequestWrapper का विस्तार। आपके रैपर को getSession(boolean) में अपनी कस्टम HttpSession कक्षा वापस करनी चाहिए। फ़िल्टर में, अपने HttpServletRequestWrapper का उपयोग करें।

+0

हाँ - मुझे पता है कि आप request.getSession() को कॉल करते समय MyHttpSession को वापस करने के लिए एप्लिकेशन सर्वर (यानी, ग्लासफ़िश, वेबलोगिक) कैसे प्राप्त करते हैं? – plymouth5

+0

आप किस एप्लिकेशन सर्वर का उपयोग कर रहे हैं? – CrackerJack9

+0

आज मैं वर्तमान में ग्लासफ़िश 3 का उपयोग करता हूं – plymouth5

1

ऐसा लगता है कि यह एक पोर्टेबल फैशन में आसानी से करने योग्य नहीं है जो विभिन्न कंटेनर के बीच काम करेगा, क्योंकि एचटीपीएसशन कार्यान्वयन जे 2 ईई कंटेनर द्वारा प्रदान किया जाता है।

हालांकि, एक समान परिणाम प्राप्त करने के लिए, आप एक javax.servlet.Filter और javax.servlet.HttpSessionListener को लागू कर सकते हैं और अपने फ़िल्टर में, ServletRequest और ServletResponse को लपेटें, जैसे Spring Boot with Hazelcast and Tomcat में वर्णित।

4

इसके दो तरीके।

अपने HttpServletRequestWrapper कार्यान्वयन में मूल HttpSession "लपेटना"।

मैंने इसे थोड़ी देर पहले हेज़ेलकास्ट और वसंत सत्र के साथ वितरित सत्रों के क्लस्टरिंग के लिए बनाया था।

Here बहुत अच्छी तरह से समझाया गया है।

पहले, लागू अपनी खुद की HttpServletRequestWrapper

public class SessionRepositoryRequestWrapper extends HttpServletRequestWrapper { 

     public SessionRepositoryRequestWrapper(HttpServletRequest original) { 
       super(original); 
     } 

     public HttpSession getSession() { 
       return getSession(true); 
     } 

     public HttpSession getSession(boolean createNew) { 
       // create an HttpSession implementation from Spring Session 
     } 

     // ... other methods delegate to the original HttpServletRequest ... 
} 

, के बाद अपनी खुद की फ़िल्टर से, मूल HttpSession लपेटता है, और FilterChain अपने सर्वलेट कंटेनर द्वारा प्रदान के अंदर डाल दिया।

public class SessionRepositoryFilter implements Filter { 

     public doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
       HttpServletRequest httpRequest = (HttpServletRequest) request; 
       SessionRepositoryRequestWrapper customRequest = 
         new SessionRepositoryRequestWrapper(httpRequest); 

       chain.doFilter(customRequest, response, chain); 
     } 

     // ... 
} 

अंत में, यह सुनिश्चित करने के लिए कि यह किसी अन्य से पहले प्रदर्शन करता है, अपने फ़िल्टर को web.xml में सेट करें।

इसे प्राप्त करने का दूसरा तरीका है जो आपके सर्वलेट कंटेनर को आपके कस्टम सत्र प्रबंधक को प्रदान करता है।

उदाहरण के लिए, Tomcat 7 में।

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