2014-12-23 40 views
0

在我們的JAVA web應用程序中,我們在數據庫表active_sessions中維護用戶會話。而且我們不允許每個用戶有多個會話。它意味着什麼,如果您已經使用特定的用戶帳戶登錄,則無法使用同一個帳戶打開新的會話。如果有人這樣做,我們顯示錯誤'用戶已經有一個活動會話'。當用戶點擊Logout時,從表active_sessions中刪除他的輸入。但是,如果用戶在不註銷的情況下關閉窗口,他的條目仍保留在表active_sessions中。因此,任何未來嘗試登錄都會導致錯誤「用戶已經有活動會話」。關於如何在數據庫中銷燬用戶會話的任何提示,以防他在不註銷的情況下關閉瀏覽器窗口。銷燬存儲在窗口關閉的數據庫中的用戶會話

編輯:閱讀所有帖子後,似乎沒有乾淨的方式來限制每個用戶的單個會話。

+2

這是非常危險的! – SMA

+0

同意@almasshaikh。會話應該在超時時自動關閉(不管用戶退出Web應用程序的方式)。如果用戶在一段時間內未處於活動狀態,請殺掉他們的會話。這將允許用戶重新登錄。編輯:替代方法,下一次登錄嘗試會自動使第一個會話無效,踢出該會話。 – Dave

+1

有多個同時「會話」有什麼問題?這是你的網絡應用程序設計或許可/權利問題的限制嗎?我個人會討厭任何限制我自由的網絡應用程序。 –

回答

2

使用'onbeforeonload'JavaScript事件,它可以向服務器執行AJAX調用以刪除條目。但是,每次頁面卸載時都會執行此事件,所以如果您沒有SPA,那麼您將需要忽略href等事件。

同意Almas,但是你的方法是危險的,因爲它不可能強制執行這個100%。例如。如果用戶殺死瀏覽器進程,那麼即使這個JS事件也不會被髮布。此外,用戶可以簡單地使用其他瀏覽器繞過您的「保護」。

+0

危險建議!如果作爲攻擊者,我看到JS會導致會話終止,並隨機終止其他用戶的用戶會話? – Dave

+1

@Dave,閱讀OP的問題;這不會終止會話,但只是從數據庫中刪除它+顯然你不會在AJAX調用中傳遞sessionId! –

+0

我讀到了這個問題,並且我認爲從'active_sessions'表中刪除的記錄會有效地終止其他webapp中的會話(否則,爲什麼不只是讓Tomcat等進行會話管理?)。你能保證整個網絡路徑是安全的嗎?如果沒有,攻擊者可能會看到sessionId並執行所需的調用來激活活動用戶。客戶端的會話管理實際上總是一個壞主意。 – Dave

1

在服務器端用戶HTTP會話通常在一段空閒時間後失效。您可以實現http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSessionListener.html並在web.xml中註冊它以接收有關會話創建/銷燬等的通知。在您的偵聽器實現中,您可以刪除會話銷燬事件中的表條目。

+0

如果OP能和它一起生活,那麼這肯定是要走的路。 –

+0

如何關閉瀏覽器選項卡。他的會議不會立即失效。但經過一段時間的空閒時間後。因此,如果其他人在會話超時時間內打開一個新標籤,他將能夠繼續用戶的會話。我主要關心的是,在瀏覽器選項卡中,來自'HttpSessionListener'的通知不會是即時的。所以用戶帳戶有可能被盜用。 –

0

有關HTTP的基本知識就是請求/響應協議。 即只有通過向服務器發出請求才能更改/訪問事物。這個「限制」使你的需求變得有趣。可以有兩種解決方法: -

  1. 通過AJAX調用以重複間隔輪詢服務器。只要你的應用程序不斷獲得輪詢AJAX請求,你可以假定該窗口是打開的。

  2. 使用javascript(window.onunload)在瀏覽器關閉時觸發事件以銷燬用戶會話。

Using onuload