2015-01-03 11 views
7

İlkbahar başlangıcında yeni başlıyorum. yol
takip ederek sona edilebilir dosyamın Oturumu'ndaİlkbaharda Oturum bitmeden önce özel etkinliği gerçekleştirin

-> Başarı Log-out (Açık Oturum aşımı)

-> Oturum Zaman Aşımı (Örtülü Günlüğü aşımı) Ben

Bazı kullanıcılar oturum açtığında ve kullanıcı oturumu zaman aşımı olduğunda (Implicit Log-out) veritabanında DML (kayıt silme) gerçekleştirmek istediğimde DML (kayıt ekleme) veritabanında yaparlar.

Benim sorum şu ki, Bahar'ın oturumun sona ermesinden önce bize bildiren bir yolu var. Bu yüzden, oturumu sona erdirmeden önce özel etkinliğimi gerçekleştirebilirim. peşin

Teşekkür

+0

Onun tehlikeli cevap @Codo benzer şekilde takip ederek sorunumu çözmüş? Kullanıcı oturumu etkinken uygulamanız azalırsa ne olur? – SMA

+0

o zaman bir sonraki adıma ne almalıyım? –

+0

gerçekten DB'de sakladığınız kayıtlara ve bu kayıtların ne kadar önemli olduğuna bağlıdır. – SMA

cevap

14

Evet, SessionDestroyedEvent ile yapabilirsiniz.

@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 
     } 
    } 

} 

Ve web.xml''deki

:

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

Bu olay normal logout yanı sıra oturum zaman aşımı ikisi için tetiklenir.

+0

Ne yapamazsınız? Kullandığınız belirli uygulama sunucusunu hacklemedikçe, olayları olaydan önce alamıyorsanız, olayları olay sırasında veya sonrasında alabilirsiniz. –

+0

Evet Çözümün @Codo'yu aldım cevabınız yardımcı oldu. Bu yaklaşıma gidersem –

+0

'Spring Security' bileşenine bağımlıyım. Kayıt yaptırılması gereken Dinleyici'yi gördükten sonra bu soruyu yaşadım. – yathirigan

4

Sana bildirim özledim ne olur ..

@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

, ben sadece applicationEvent ve çözümünüzde belirtildiği gibi HttpSessionDestroyedEvent yerine SessionDestroyedEvent öğesini görebiliyorum. Bu ne fark eder? – yathirigan

İlgili konular