2015-01-03 4 views
7

Я начинаю с весны.Выполнение пользовательского события до истечения срока действия сеанса весной

В моем случае сессии может истечь, следуя пути
-> Success Вход-выход (Явная Log-аут)

-> Тайм-аут сеанса (неявный Log-аут)

У меня есть делать DML (запись вставки) в базу данных всякий раз, когда какой-либо пользователь входит в систему, и я хочу выполнить DML (удаление записи) в базе данных всякий раз, когда пользовательский тайм-аут сеанса (неявный выход из системы).

Мой вопрос в том, что есть весной, каким образом мы расскажем об этом до истечения срока действия сессии. Таким образом, я могу выполнить свое пользовательское событие до истечения срока действия сеанса.

Заранее спасибо

+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

Да, я получил решение @Codo, ваш ответ полезен. –

+0

Мне нужен компонент Spring Spring в моей зависимости, если я собираюсь использовать этот подход. У меня был этот вопрос, увидев слушателя, который должен быть зарегистрирован. – 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

во время сеанса Событие Destroy в моем приложении Spring Boot, я могу видеть, что applicationEvent является только экземпляром SessionDestroyedEvent, а не HttpSessionDestroyedEvent, как указано в вашем решении. Какая разница? – yathirigan

Смежные вопросы