Начиная со спецификации 2.3 сервлета, контейнеры сервлетов Java, такие как Apache Tomcat, предоставляют интерфейс HttpSessionListener для выполнения пользовательской логики в случае созданных или уничтоженных сеансов.Основное использование:
package com.example;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
}
}
Добавьте MySessionListener
к вашему web.xml
или - в случае Spring - объявите для него bean-компонент Spring, обнаруженный Spring.Однако Spring не требуется, поскольку HttpSessionListener
является частью спецификации сервлета Java.
Если вы перейдете на Spring Session с Redis, вы можете продолжить использовать HttpSessionListener
, добавив его в конфигурацию Spring, как описано в официальных документах .
@EnableRedisHttpSession
public class Config {
@Bean
public MySessionListener mySessionListener() {
return new MySessionListener();
}
// more Redis configuration comes here...
}
Кроме того, Spring Session поставляется с поддержкой «родного» способа подписки и публикации событий: ApplicationEvent .В зависимости от подхода сохранения сеанса в настоящее время вашим приложением может быть отслежено до трех событий: SessionExpiredEvent
, SessionCreatedEvent
, SessionDestroyedEvent
.
Реализация EventListener
для подписки наСобытия весенней сессии, например:
package com.example;
import org.springframework.context.event.EventListener;
import org.springframework.session.events.SessionCreatedEvent;
import org.springframework.session.events.SessionDestroyedEvent;
import org.springframework.session.events.SessionExpiredEvent;
import org.springframework.stereotype.Component;
@Component
public class MySessionEventListener {
@EventListener
public void sessionDestroyed(SessionDestroyedEvent event) {
}
@EventListener
public void sessionCreated(SessionCreatedEvent event) {
}
@EventListener
public void sessionExired(SessionExpiredEvent event) {
}
}