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實現)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章