2012-10-10 10 views
9

मेरे पास एक वेब ऐप है जहां web.xml में मैंने श्रोता के रूप में HttpSessionEventPublisher जोड़ा है। वेब ऐप जेटी 7.x पर चलता है और हम वसंत 3.1.1 का उपयोग कर रहे हैं।स्प्रिंग सत्र हैंडलिंग: HttpSessionDestroyedEvent

यह वसंत संदर्भ घटना श्रोताओं को HttpSessionCreatedEvent और HttpSessionDestroyedEvent आग लगाना है।

मेरे पास एक बीन (@Controller) है जो ApplicationListener<ApplicationEvent> लागू करता है। ApplicationEventHttpSessionCreatedEvent और HttpSessionDestroyedEvent का सामान्य अभिभावक वर्ग है। जब मैं अब अपने वेब एप्लिकेशन में लॉगिन करता हूं या उससे लॉग आउट करता हूं तो मुझे उम्मीद है कि इन घटनाओं को onApplicationEvent(ApplicationEvent event) विधि पर निकाल दिया जाएगा। मुझे कुछ अनुरोध हैं जैसे कि कुछ अनुरोध हैंडलिंग कार्यक्रम, लेकिन अपेक्षित घटना दिखाई नहीं दे रही है। मैंने ऐप को थोड़ा सा पता लगाया है, HttpSessionEventPublisher निश्चित रूप से घटना को घटना को निकाल देता है, लेकिन श्रोता से संपर्क नहीं किया जाता है। मुझे यहाँ क्या याद आती है?

उत्तर

8

समस्या यह है कि HttpSessionEventPublisher जावाडोक के अनुसार "स्प्रिंग रूट वेब अनुप्रयोग कॉन्टैक्ट" पर ईवेंट प्रकाशित करता है, यह आपके वेब.एक्सएमएल फ़ाइल में ContextLoaderListener प्रविष्टि के माध्यम से पंजीकृत एप्लिकेशन संदर्भ है। दूसरी तरफ आपका @ नियंत्रक शायद एक अलग अनुप्रयोग संदर्भ के माध्यम से पंजीकृत है - जिसे डिस्पैचर सर्वलेट के माध्यम से पंजीकृत किया गया है। इसलिए मैं सुझाव दूंगा कि आप एक अलग एप्लिकेशन लिस्टर बनाएं, इसे रूट वेबप्लिकेशन कॉन्टेक्स्ट में पंजीकृत करें, ईवेंट तब तक आना चाहिए।

0

एक समान समस्या का सामना करना, यदि आपके एप्लिकेशन लिस्टर को मूल संदर्भ में स्थानांतरित करना संभव नहीं है, तो आप org.springframework.security.context.DelegatingAplicationListener का उपयोग कर सकते हैं।

बस अपने बीन में एक DelegatingApplicationListener autowire और (एक वसंत-सुरक्षा से जगह में पहले से ही होना चाहिए)

DelegatingApplicationListener के खिलाफ अपने श्रोता रजिस्टर करने के लिए उपयोग करने के निर्माता/@PostConstruct