2010-09-22 12 views
48

मान लें कि मेरे पास 0 या अधिक वैध HttpSession ऑब्जेक्ट्स से जुड़े ऑब्जेक्ट्स के साथ चल रहे जावा-आधारित वेब एप्लिकेशन हैं। मैं वैध HttpSession ऑब्जेक्ट्स की वर्तमान सूची तक पहुंचने का एक तरीका चाहता हूं। मैं सोच रहा था कि मैं HttpSessionListener को कार्यान्वित कर सकता हूं और इसे एप्लिकेशन आईडी स्केल किए गए एट्रिब्यूट में संग्रहीत सत्र आईडी मानों की एक सूची में शामिल करने के लिए उपयोग कर सकता हूं, लेकिन फिर मैं सूची को अपडेट करने के लिए हुक पर हूं क्योंकि सत्र अमान्य हैं और कौन जानता है और क्या।मैं वेब अनुप्रयोग में सभी HttpSession ऑब्जेक्ट्स की सूची कैसे प्राप्त करूं?

इससे पहले कि मैं अपने खुद के समाधान पाक शुरू मैंने सोचा कि मैं यह प्रश्न पूछना चाहिए:
सर्वलेट एपीआई गैर अवैध सत्र वस्तुओं की पूरी सूची तक पहुंच पाना के कुछ साधन प्रदान करता है?

मैं अपने वेब एप्लिकेशन कंटेनर और माईफैस 1.2.एक्स (जेएसएफ) लाइब्रेरी के रूप में टोमकैट 6.x का उपयोग कर रहा हूं।

मैं HttpSessionBindingListener लागू करने के लिए SessionData वर्ग द्वारा संशोधित:

समाधान
मैं एक दृष्टिकोण है कि इन मौजूदा प्रश्नों में चर्चा BalusC के लिए इसी तरह का पालन किया। जब बाध्यकारी घटना होती है, तो ऑब्जेक्ट या तो SessionData ऑब्जेक्ट्स के सेट से स्वयं को जोड़ या निकाल देगा।

@Override 
public void valueBound(HttpSessionBindingEvent event) { 
    // Get my custom application-scoped attribute 
    ApplicationData applicationData = getApplicationData(); 
    // Get the set of all SessionData objects and add myself to it 
    Set<SessionData> activeSessions = applicationData.getActiveSessions(); 
    if (!activeSessions.contains(this)) { 
     activeSessions.add(this); 
    } 
} 

@Override 
public void valueUnbound(HttpSessionBindingEvent event) { 
    HttpSession session = event.getSession(); 
    ApplicationData applicationData = getApplicationData(); 
    Set<SessionData> activeSessions = applicationData.getActiveSessions(); 
    if (activeSessions.contains(this)) { 
     activeSessions.remove(this); 
    } 
} 

एक चीज जो मुझे परेशान करती रहती है वह तब होता है जब टॉमकैट पुनरारंभ होता है। जब तक टोमकैट को डिस्क पर सत्रों को क्रमबद्ध नहीं करने के लिए ठीक से कॉन्फ़िगर किया गया है, तो ऐसा होगा। जब टॉमकैट फिर से शुरू होता है, HttpSession ऑब्जेक्ट्स (और SessionData ऑब्जेक्ट्स उनके साथ) deserialized हैं और सत्र फिर से वैध कर रहे हैं। हालांकि, serialization/deserialization HttpSession श्रोता कार्यक्रमों को पूरी तरह से हटा देता है, इसलिए मुझे पुनरारंभ करने के बाद ऑब्जेक्ट्स के अपने प्रबंधित सेट में SessionData पर deserialized संदर्भ को गहराई से रखने का अवसर नहीं है।

मेरे ग्राहक के संगठन में टॉमकैट के उत्पादन कॉन्फ़िगरेशन पर मेरा कोई नियंत्रण नहीं है, इसलिए मैं यह नहीं मान सकता कि यह वही तरीका होगा जिसकी मैं अपेक्षा करता हूं।

मेरा कामकाज HttpSession निर्माण समय के साथ एप्लिकेशन स्टार्टअप समय के साथ निर्माण समय की तुलना करना है। यदि सत्र स्टार्टअप समय से पहले सत्र बनाया गया था, तो मैं invalidate() पर कॉल करता हूं और उपयोगकर्ता को क्या हुआ इसके स्पष्टीकरण के साथ एक त्रुटि/चेतावनी पृष्ठ पर भेजा जाता है।

मुझे ServletContextListener लागू करके एप्लिकेशन स्टार्टअप समय मिलता है और मेरे श्रोता के contextInitialized() विधि के भीतर से एप्लिकेशन-स्कोप्ड ऑब्जेक्ट के अंदर वर्तमान समय संग्रहीत करता है।

उत्तर

40

नहीं, सर्वलेट एपीआई एक रास्ता प्रदान नहीं करता है। HttpSessionListener की सहायता से आपको वास्तव में उन सभी को पकड़ना होगा।आप नीचे दिए गए जवाब में कई उदाहरण मिल सकते हैं:

9

कोई सीधे आगे तरीका नहीं है। यह तैनाती पर निर्भर करता है। वितरित तैनाती और भार संतुलन को पेश करने का निर्णय लेने के बाद उपरोक्त विफल हो जाएगा।

+1

मेरा आवेदन करना होगा एक निजी नेटवर्क पर उपयोगकर्ताओं की सीमित संख्या, इसलिए मुझे वितरित तैनाती का समर्थन करने की आवश्यकता नहीं होगी। हालांकि मैं आपकी टिप्पणी से सहमत हूं। –

+0

मुझे लगता है कि इसे संशोधित करने का तरीका (साथ ही ऑन-डिस्क-पर्सिस्टेंस गॉचा) श्रोता को एक साझा डेटास्टोर (रेडिस, मेमकैच या कुछ) अपडेट करना होगा जो सत्रों का ट्रैक रखता है। – Thilo

1

नहीं वास्तव में एक जवाब है, लेकिन अच्छा ol 'दिनों में वहाँ "javax.servlet.http.HttpSessionContext" था, लेकिन यह, संस्करण 2.1 के रूप में हटा दिया गया था स्पष्ट रूप से कोई प्रतिस्थापन के साथ: https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpSessionContext.html

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

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