java कहत मैं वेब अनुप्रयोग में सभी HttpSession ऑब्जेक्ट्स की सूची कैसे प्राप्त करूं?




वेबसाइट किसे कहते है (3)

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

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

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

उपाय
मैंने इन मौजूदा प्रश्नों में बलुससी की चर्चा के समान दृष्टिकोण का पालन किया:

मैंने SessionData को लागू करने के लिए HttpSessionBindingListener SessionData श्रेणी द्वारा संशोधित किया। जब एक बाध्यकारी घटना होती है, तो ऑब्जेक्ट या तो सभी SessionData ऑब्जेक्ट्स के सेट से स्वयं को जोड़ या निकाल 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 फिर से शुरू होता है, तो HttpSession ऑब्जेक्ट्स (और उनके साथ SessionData ऑब्जेक्ट्स) deserialized हैं और सत्र फिर से वैध कर रहे हैं। हालांकि, serialization / deserialization पूरी तरह से HttpSession श्रोता कार्यक्रमों को HttpSession है, इसलिए मुझे फिर से शुरू करने के बाद ऑब्जेक्ट्स के अपने प्रबंधित सेट में SessionData को deserialized संदर्भ देने का मौका नहीं है।

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

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

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


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


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


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





httpsession