2013-05-20 107 views
2

我有一個要求,即如果用戶從一個瀏覽器登錄,那麼她不能從任何其他地方登錄。一次只有一個用戶登錄

我所做的是當用戶登錄在我進入她的狀態在日誌表的登錄,當她登出我更新狀態。

問題出現:如果她沒有註銷並關閉瀏覽器會怎麼樣?

任何幫助或改善將提前:-)我使用笨作爲後端工具可以理解的。

+3

在每個頁面請求上更新的數據庫中實現「last seen at」字段。如果用戶在X分鐘內沒有看到該用戶,則認爲該用戶已註銷。 –

+0

@Jonathon Reinhart你的意思是在每個頁面請求我必須檢查「最後看到」字段的數據庫?我將保存在這個領域?IP地址? – user2013626

+0

這將是一個時間戳。 –

回答

1

在服務器端做到這一點是最好的選擇。您可以保留您的應用程序上下文中的登錄用戶。

嗯,有點提示。使用一個Servlet過濾器,例如AuthFilter,並進行驗證,可能是isAlreadyLoggedIn(),在那裏旁邊其他驗證,如用戶名/密碼等。現在有了這個檢查後,你要麼 - 它取決於你想要什麼與用戶試圖登錄到做到,顯示「用戶已經登錄」的消息,

+0

問題出現在他剛剛關閉瀏覽器時,我怎麼才能知道他已經註銷? – user2013626

+0

當時你需要使用session-timeout作爲用戶登錄,並且確保你可以給會話超時一點小小的價值 – Gautam3164

+0

會話被瀏覽器破壞了嗎?我無法跟蹤會話超時嗎? – user2013626

0

正如其他人所說,使用在服務器/數據庫端超時是你最好的選擇。

你問的方式來檢測,如果用戶關閉瀏覽器 - 有JavaScript的onunload事件其中,在大多數時候,如果用戶關閉了瀏覽器窗口,將閃光。但是,它不會因緊急停車而關閉,或者如果javascript已關閉,所以它不是非常可靠。

還有其他一些原因,爲什麼在服務器端實現超時是推薦的方法。例如,用戶可能剛從公共計算機登錄並忘記註銷。在這種情況下,即使瀏覽器窗口仍處於打開狀態,您確實希望在某個時間點超時。

此外,有某種超時會減少會話修復攻擊的變化。