2015-09-04 58 views
1

我爲我的web應用程序使用Spring Boot,AngularJS和REST。我還使用JWT/oAuth令牌進行用戶驗證和授權,這意味着會話是無狀態的。Session Override implementation

我們有一個要求,一個用戶不應該被允許重複會話。

我已經實現了一種方式,如果用戶從同一臺機器或任何其他機器的任何其他瀏覽器登錄,則會顯示一個會話覆蓋確認消息。

如果會話被覆蓋,那麼當用戶嘗試執行任何活動時,第一個會話將終止。
爲此,該用戶的最後一個令牌生成時間保存在服務器內存中。
如果傳入令牌生成時間與內存中的時間匹配,則授予訪問權限,否則會引發會話過期錯誤。
當用戶執行成功的註銷時,該用戶的條目將從內存中清除,新的認證請求不會拋出會話覆蓋錯誤。

現在發生的情況是,只要用戶沒有成功註銷並且只是關閉瀏覽器窗口,那麼服務器值就不會被清除。 並且當用戶嘗試再次登錄時,即使(從用戶的角度來看)會話重寫消息也被拋出,沒有重複的會話。

我的問題是:有什麼辦法可以避免在上述場景發生時顯示會話覆蓋消息,但同時如果用戶真的嘗試重複會話顯示覆蓋消息?

是否有任何應用/設計可用於處理此類情況?

歡迎任何建議/想法。

回答

0

我有類似的情況,當我需要檢測用戶是否手動註銷或會話超時(通常他們忘記了通過關閉瀏覽器註銷)。

我做的是利用彈簧ApplicationListener

public class SessionAuditListener implements ApplicationListener<ApplicationEvent> { 

    @Override 
    public void onApplicationEvent(ApplicationEvent applicationEvent) { 
     if (applicationEvent instanceof HttpSessionDestroyedEvent) { 
      // do whatever it needs here 
      HttpSession httpSession = ((HttpSessionDestroyedEvent) applicationEvent).getSession();   
     } 

    } 
}