我目前正在计划一个需要在会话创建和过期时都运行功能的应用程序。我正在计划使用Redis之类的东西,但我愿意接受其他想法。我正在寻找的是n注释,例如@whenexpires和@whencreated。我知道大多数会话注释都在班上,而不是谢谢。
答案 0 :(得分:0)
从Servlet规范2.3开始,Java Servlet容器(例如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,则声明一个Spring可以检测到的Spring bean。但是,由于HttpSessionListener
是Java Servlet规范的一部分,因此不需要Spring。
如果要通过Redis参加Spring Session,则可以按照official docs中的说明将HttpSessionListener
添加到Spring配置中,继续使用。{p>
@EnableRedisHttpSession
public class Config {
@Bean
public MySessionListener mySessionListener() {
return new MySessionListener();
}
// more Redis configuration comes here...
}
此外,Spring Session附带了事件订阅和发布的“ Spring原生”方式的支持: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) {
}
}