我目前正在计划一个应用程序,它需要在创建会话和到期时运行函数。我打算使用像redis这样的东西,但我对其他想法持开放态度。我正在寻找的是一个注释,如@whenexpires和@whencreated。我知道大多数会话的注释都在课堂上,而不是方法谢谢。
从Servlet规范2.3开始,像Apache Tomcat这样的Java Servlet容器提供了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的情况下 - 为Spring声明一个Spring bean。但是,不需要Spring,因为HttpSessionListener
是Java Servlet规范的一部分。
如果您使用Redis进行Spring Session,您可以继续使用HttpSessionListener
,将其添加到Spring配置中,如official docs中所述。
@EnableRedisHttpSession
public class Config {
@Bean
public MySessionListener mySessionListener() {
return new MySessionListener();
}
// more Redis configuration comes here...
}
此外,Spring Session还支持“Spring-native”的事件订阅和发布方式:ApplicationEvent。根据会话持久性方法,您的应用程序当前最多可以捕获三个事件:SessionExpiredEvent
,SessionCreatedEvent
,SessionDestroyedEvent
。
实现EventListener
以订阅Spring Session事件,例如:
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) {
}
}