spring-session改造总结(二)

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注解的方式,但是实际测试并没有起作用,尚不知原因。

参考:
[1] spring-session源码(本文内容主要参考redis实现)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值