2015-01-03 6 views
7

मैं वसंत ढांचे में शुरुआत कर रहा हूं।स्प्रिंग में सत्र समाप्ति से पहले कस्टम ईवेंट करें

मेरे मामले सत्र निम्नलिखित तरीके
तक समाप्त हो जा सकता है -> सफलता के लिए लॉग-आउट (स्पष्ट लॉग-आउट)

-> सत्र का समय समाप्त (अंतर्निहित लॉग-आउट)

मेरे पास है जब भी कुछ उपयोगकर्ता लॉग इन करते हैं तो डेटाबेस में डीएमएल (रिकॉर्ड सम्मिलन) करें और जब भी उपयोगकर्ता सत्र टाइमआउट (लागू लॉग-आउट) डेटाबेस में डीएमएल (रिकॉर्ड हटाना) करना चाहते हैं।

मेरा प्रश्न यह है कि वसंत में कोई रास्ता है जो सत्र की समाप्ति से पहले हमें बताता है। तो मैं सत्र समाप्ति से पहले अपना कस्टम ईवेंट कर सकता हूं।

अग्रिम धन्यवाद

+0

इसके खतरनाक जवाब देने से मेरी समस्या हल है .. क्या हुआ अगर आप अधिसूचना याद आती है? यदि उपयोगकर्ता का सत्र सक्रिय था तो आपका ऐप डाउन हो जाएगा? – SMA

+0

तो मुझे अगला कदम क्या लेना चाहिए? –

+0

जो वास्तव में इस बात पर निर्भर करता है कि आप डीबी में किस रिकॉर्ड को स्टोर करते हैं और ये रिकॉर्ड कितने महत्वपूर्ण हैं .. – SMA

उत्तर

14

हाँ, आप SessionDestroyedEvent साथ ऐसा कर सकते हैं।

@Component 
public class SessionEndedListener implements ApplicationListener<SessionDestroyedEvent> { 

    @Override 
    public void onApplicationEvent(SessionDestroyedEvent event) 
    { 
     for (SecurityContext securityContext : event.getSecurityContexts()) 
     { 
      Authentication authentication = securityContext.getAuthentication(); 
      YourPrincipalClass user = (YourPrincipalClass) authentication.getPrincipal(); 
      // do something 
     } 
    } 

} 

और web.xml में:

<listener> 
    <listener-class> 
     org.springframework.security.web.session.HttpSessionEventPublisher 
    </listener-class> 
</listener> 

यह घटना दोनों नियमित रूप से लॉगआउट के साथ ही सत्र टाइमआउट के लिए सक्रिय किए जाएंगे।

+0

क्या आप ऐसा करने में सक्षम नहीं होंगे? जब तक आप उस विशिष्ट एप्लिकेशन सर्वर को हैक नहीं करते जिसे आप उपयोग कर रहे हैं, आप इस तथ्य से पहले घटनाएं प्राप्त करने में सक्षम नहीं हैं, आप इस तथ्य के दौरान या उसके बाद घटनाएं प्राप्त करते हैं। –

+0

हां मुझे समाधान मिला @ कोडो आपका उत्तर सहायक है। –

+0

अगर मुझे इस दृष्टिकोण के साथ जा रहा है तो मुझे अपनी निर्भरता में 'स्प्रिंग सिक्योरिटी' घटक की आवश्यकता होगी। श्रोता को देखने के बाद मुझे यह प्रश्न था जिसे पंजीकृत होने की आवश्यकता है। – yathirigan

4

मैं निम्नलिखित समान तरीके @Codo

@Component 
public class SessionCreatedListenerService implements ApplicationListener<ApplicationEvent> { 

private static final Logger logger = LoggerFactory 
     .getLogger(SessionCreatedListenerService.class); 

@Autowired 
HttpSession httpSession; 



@Override 
public void onApplicationEvent(ApplicationEvent applicationEvent) { 
    if(applicationEvent instanceof HttpSessionCreatedEvent){ //If event is a session created event 



    }else if(applicationEvent instanceof HttpSessionDestroyedEvent){ //If event is a session destroy event 
     // handler.expireCart(); 

     logger.debug(""+(Long)httpSession.getAttribute("userId")); 

     logger.debug(" Session is destory :"); //log data 

    }else if(applicationEvent instanceof AuthenticationSuccessEvent){ //If event is a session destroy event 
     logger.debug(" athentication is success :"); //log data 
    }else{ 
     /*logger.debug(" unknown event occur : " Source: " +); //log data 
    } 
} 
} 
+0

मेरे स्प्रिंग बूट एप्लिकेशन में सत्र को नष्ट करने के दौरान, मैं एप्लिकेशन समाधान को देख सकता हूं और आपके समाधान में उल्लिखित HttpSessionDestroyedEvent की बजाय सत्रडिस्ट्रॉइडएवेंट का उदाहरण है। वह क्या अंतर है? – yathirigan

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