我們有一個使用spring mvc和spring security等等的web應用程序。當會話超時,我們要清除的數據X.什麼時候發送HttpSessionDestroyedEvent以及爲什麼
我們註冊一個監聽器,看起來像這樣:
public class SessionDestroyedEventListener implements ApplicationListener<HttpSessionDestroyedEvent> {
@Override
public void onApplicationEvent(HttpSessionDestroyedEvent event) {
for (SecurityContext securityContext : event.getSecurityContexts()) {
AuthenticationDetails authenticationDetails = getAuthenticationDetails(securityContext.getAuthentication());
// clean out data X
}
}
}
定義爲一個bean
@Bean
public SessionDestroydEventListener sessionDestroydEventListener() {
return new SessionDestroydEventListener();
}
正如我所說,此監聽器的主要用途是在會話長時間不活動時刪除數據X.但是,由於我們無法弄清楚的原因,這個偵聽器偶爾會在超時之前調用,導致數據X被刪除並且用戶會話中斷。這些事件意外發生,導致用戶體驗不佳(用戶在與我們的網站積極合作的過程中註銷)。
我想知道爲什麼SessionDestroyedEventListener.onApplicationEvent被調用時,我不希望它。我正在努力尋找有關這方面的有用信息,或者遇到類似問題的其他人。
我們遇到的一個問題是,當發生這種情況時,我們的日誌會保持沉默 - 沒有堆棧跟蹤,它通常看起來像是當突然調用SessionDestroyedEventListener時,一切正常。
整個設置很複雜,我覺得實際上可能很難在這個計算器報告中解決我們的核心問題,我主要關注如何排除故障的提示 - 是否有某處我可以找到有關導致該問題的信息事件(是否超時,來自瀏覽器的錯誤jsessionid等)還是以某種方式進行設置,以便我們獲得有關所發生事件的更多信息。
雖然我可以提到,我們有一個apache前端負載平衡到兩個或更多的野蠻服務器,每個服務器運行我們的Web應用程序。使用粘性會話,瀏覽器會話使用jsessionid鎖定到野蠻服務器。
編輯:爲了澄清,主要問題並不是我們想要實施檢查會話被銷燬的原因,問題是會話在超時之前被銷燬。要知道原因會很好,因爲它會讓我們知道會話如何被破壞,所以我們可以找到問題的根源。
是否即使用戶仍然在站點上活動,沒有與服務器的通信發生,超時觸發?我已經看到了這種情況,我們通過實施心跳信號來解決這個問題,以保持會話的活躍。 – kaqqao
@kaqqao:我們的網站使用頻繁重新加載網站的頁面,並且在用戶可能在頁面上逗留而沒有向服務器發送查詢的地方,我們會有像您一樣的心跳信號。在查詢從瀏覽器發送到我們的野蠻服務器(我們可以在日誌時間戳中看到它)後,我們的隨機註銷很快發生(2-30秒)並不罕見。 –