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註解的方式,但是實際測試並沒有起作用,尚不知原因。