मान लें कि मेरे पास 0 या अधिक वैध HttpSession
ऑब्जेक्ट्स से जुड़े ऑब्जेक्ट्स के साथ चल रहे जावा-आधारित वेब एप्लिकेशन हैं। मैं वैध HttpSession
ऑब्जेक्ट्स की वर्तमान सूची तक पहुंचने का एक तरीका चाहता हूं। मैं सोच रहा था कि मैं HttpSessionListener
को कार्यान्वित कर सकता हूं और इसे एप्लिकेशन आईडी स्केल किए गए एट्रिब्यूट में संग्रहीत सत्र आईडी मानों की एक सूची में शामिल करने के लिए उपयोग कर सकता हूं, लेकिन फिर मैं सूची को अपडेट करने के लिए हुक पर हूं क्योंकि सत्र अमान्य हैं और कौन जानता है और क्या।मैं वेब अनुप्रयोग में सभी HttpSession ऑब्जेक्ट्स की सूची कैसे प्राप्त करूं?
इससे पहले कि मैं अपने खुद के समाधान पाक शुरू मैंने सोचा कि मैं यह प्रश्न पूछना चाहिए:
सर्वलेट एपीआई गैर अवैध सत्र वस्तुओं की पूरी सूची तक पहुंच पाना के कुछ साधन प्रदान करता है?
मैं अपने वेब एप्लिकेशन कंटेनर और माईफैस 1.2.एक्स (जेएसएफ) लाइब्रेरी के रूप में टोमकैट 6.x का उपयोग कर रहा हूं।
- How to easily implement "who is online" in Grails or Java Application ?
- JSF: How to invalidate an user session when he logs twice with the same credentials
मैं 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()
विधि के भीतर से एप्लिकेशन-स्कोप्ड ऑब्जेक्ट के अंदर वर्तमान समय संग्रहीत करता है।
मेरा आवेदन करना होगा एक निजी नेटवर्क पर उपयोगकर्ताओं की सीमित संख्या, इसलिए मुझे वितरित तैनाती का समर्थन करने की आवश्यकता नहीं होगी। हालांकि मैं आपकी टिप्पणी से सहमत हूं। –
मुझे लगता है कि इसे संशोधित करने का तरीका (साथ ही ऑन-डिस्क-पर्सिस्टेंस गॉचा) श्रोता को एक साझा डेटास्टोर (रेडिस, मेमकैच या कुछ) अपडेट करना होगा जो सत्रों का ट्रैक रखता है। – Thilo