2011-05-09 48 views
0

我們有一個使用Struts 2,Spring和Hibernate的Web應用程序。當用戶在其他瀏覽器中登錄時,在一個瀏覽器中使用戶會話失效?

當前使用兩種不同瀏覽器(IE和FF)的用戶可以同時登錄到同一個帳戶。

現在,當您點擊登錄按鈕時,我們需要使該帳戶的所有其他登錄無效。

例如用戶登錄到Firefox上的帳戶。同一個用戶在IE中登錄到同一個帳戶。在這種情況下,當他登錄IE時,他在Firefox中的會話需要失效。

有什麼辦法可以做到這一點?

請幫

回答

1

關鍵是「同一個帳戶」。如果用戶從多個瀏覽器登錄到不同的帳戶,我絕不會這樣做。

當用戶登錄時,爲與該帳戶關聯的會話變量取一個隨機值。如果會話的值與這個值不同,那麼它不是一個有效的會話。

2

如果跟蹤的然後是,我想會是可以做到沒有登錄哪些用戶。你已經擁有了自己的身份,現在每次登錄時,你都會看到所有當前登錄用戶和他們的會話列表(保存在你喜歡的任何數據結構中:即靜態哈希映射(我知道靜態是壞的:-),但它們也是有時是有用的)並且使他以前的會話無效。

你坐在服務器上,你有權力組織會議,只要你喜歡。

+0

我想說你可以改善這兩種方式。爲了避免靜態,使用spring或guice來注入一個單例。其次,如果你有一個集羣,或者打算在近期內遷移到一個集羣,那麼你應該將這些信息存儲在一臺服務器之外,因爲不能保證第二次登錄到達同一臺服務器。 Memcached可能會正常工作,但我也可以看到像DB一樣更持久的東西。您需要一種機制來更新羣集中的所有服務器,讓他們知道使多餘的會話無效。你可能需要某種pub/sub。 – rfeak 2011-05-09 18:25:37

+0

是的,我同意這是一個不考慮聚類的簡單化視圖。但正如你所建議的memcached或類似的方法應該工作好,並照顧集羣。會話將被設計複製(否則集羣將不起作用),因此它將用戶身份與會話ID相關聯。 – 2011-05-09 19:58:26

1

同意Tomasz Stanczak ..但一定要檢查帳戶第二次登錄的IP地址。否則,註銷入侵者的原始用戶很有可能登錄:-)

在我看來,我會去請求用戶在登錄之前從其他地方(比如IE)註銷在這裏(比如FF)。看一下gmail的功能(頁面底部的 - 帳戶活動),您可以從一個地方註銷所有其他會話。

+0

你假設入侵者登錄第二。 – 2011-05-09 17:15:22

+0

我們實際上不能假定它。如果入侵者首先登錄,帳戶已經不存在了。:-)您需要添加智能!這很複雜,gmail獲得了我見過的複雜認證系統之一。 – 2011-05-10 07:19:09

相關問題