2017-01-13 103 views
3

我們有一個使用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鎖定到野蠻服務器。

編輯:爲了澄清,主要問題並不是我們想要實施檢查會話被銷燬的原因,問題是會話在超時之前被銷燬。要知道原因會很好,因爲它會讓我們知道會話如何被破壞,所以我們可以找到問題的根源。

+0

是否即使用戶仍然在站點上活動,沒有與服務器的通信發生,超時觸發?我已經看到了這種情況,我們通過實施心跳信號來解決這個問題,以保持會話的活躍。 – kaqqao

+0

@kaqqao:我們的網站使用頻繁重新加載網站的頁面,並且在用戶可能在頁面上逗留而沒有向服務器發送查詢的地方,我們會有像您一樣的心跳信號。在查詢從瀏覽器發送到我們的野蠻服務器(我們可以在日誌時間戳中看到它)後,我們的隨機註銷很快發生(2-30秒)並不罕見。 –

回答

0

如何在事件中記錄源的名稱?

喜歡的東西event.getSource().getClass().getName();

看看是否有來自真正的閒置事件,你不希望其他事件源之間的差異。那麼如果來源不同,那麼一個好的地方如果能解決你的問題。

+0

謝謝!我似乎錯過了有一個源域,會嘗試它 - 我們偶爾會看到錯誤,並將控制器部署到我們發現錯誤的地方,因此可能需要一段時間才能報告。 –

+0

好吧,我添加了日誌記錄,並做了一個簡單的超時,按預期工作,這給了我source = io.undertow.servlet.spec.HttpSessionImpl。我會試着用這個日誌記錄來強制這個錯誤,但我想這很有可能會說HttpSessionImpl也是...... –

相關問題