spring-session改造总结(二)
前言
之前一篇spring-session改造总结主要关注基于spring-session-core实现自定义的session存储功能。本文主要关注session事件的通知。
1、事件的产生
由于在程序中主要使用HttpSessionListener,而该接口只有created和destoryed两个接口,所以根据需要,只需关注这两个接口,而其它的session事件可以根据需要添加。
由于session的存储都是在自定义SessionRepository中实现,所以事件的通知也都是由该类的操作触发。
1)session创建
session创建事件,根据描述就知道这个是在session创建的时候产生的事件,更精确的描述应该是新建的session保存成功的时候:
//SessionRepository中的save接口
public void save(RedisSession session);
就是在save成功后调用事件通知接口,而事件的通知类似:
//创建SessionCreatedEvent事件,发布该事件
publishEvent(new SessionCreatedEvent(this, session));
2) session销毁
其实session失效有几种类似的事件:
SessionDestroyedEvent,是session从存储中移除的时候触发;
SessionDeletedEvent,session由于被删除时触发。
SessionExpiredEvent,session超过生命周期时触发。
其中SessionDestroyedEvent是另外两个事件的基类。个人认为销毁事件可以根据需要触发,不一定要去基于删除或者超时的情况(删除这个主动事件还好,超时的情况对于有的存储不一定能捕获),只要检测到保存过的session不在存储中即可:
//创建SessionDestroyedEvent事件,发布该事件
publishEvent(new SessionDestroyedEvent(this, session));
2、 事件通知
前文提到的publishEvent定义如:
private void publishEvent(ApplicationEvent event) {
try {
this.eventPublisher.publishEvent(event);
}
catch (Throwable ex) {
logger.error("Error publishing " + event + ".", ex);
}
}
而eventPublisher是ApplicationEventPublisher接口,一般会定义一个空实现:
private ApplicationEventPublisher eventPublisher = new ApplicationEventPublisher() {
@Override
public void publishEvent(ApplicationEvent event) {
}
@Override
public void publishEvent(Object event) {
}
};
另外提供设置接口,由调用者设置:
public void setApplicationEventPublisher(
ApplicationEventPublisher applicationEventPublisher) {
this.eventPublisher = applicationEventPublisher;
}
3、 事件通知接口的设置
设置一般都在HttpSesionConfigure中:
@Autowired
public void setApplicationEventPublisher(
ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
在SessionRepository bean中设置:
@Bean
public MySessionRepository sessionRepository() {
...
sessionRepository.setApplicationEventPublisher(this.applicationEventPublisher);
...
return sessionRepository;
}
4、 事件通知的使用
session事件的通知主要通过HttpSessionListener来实现,即需要定义自己的监听器:
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
...
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
...
}
创建session configer,注册监听器:
@Configuration
public class MyHttpSessionConfig {
@Bean
public HttpSessionListener httpSessionListener() {
return new MyHttpSessionListener();
}
}
总结
session事件的产生、通知功能,实现起来还是比较简单的。 但是还是有遗留问题,上文列出的使用@Configuration注册listener只是其中一种,还有一种通过@WebListener注解的方式,但是实际测试并没有起作用,尚不知原因。