2010-07-02 116 views
7

我想讓我的網站一次只允許一個會話。例如,假設用戶已經登錄到我的網站在Firefox上,如果用戶再次登錄到另一臺瀏覽器,如歌劇在同一臺計算機或不同的計算機上,Firefox上的會話將被銷燬。但是,如果仍然是一個會話,Firefox上的會話仍然保留。我可以知道我該怎麼做?我正在使用PHP和Apache。謝謝。一次只允許一個會話

問候。 Benjamin

+0

你能解釋一下嗎,你的意思是你想讓同一個用戶可以同時登錄到不同的計算機嗎?如果我錯了,請糾正我。 – 2010-07-02 09:27:16

+0

@Chetan:我想他想要的是相反的 – 2010-07-02 09:29:32

+0

* [john在host89 dot net *上的[PHP session_destroy](http://php.net/manual/en/function.session-destroy.php)頁面的帖子可能會幫幫我。 – Mike 2010-07-02 09:34:30

回答

10

我會建議你做這樣的事情:

假設當用戶在以「COM_1」,「A」包廂,首次。針對該會話在數據庫中保存唯一的代碼,並且與用戶會話保持一致。

同時,如果他(用戶「A」)再次登入「com_2」,然後檢查他在數據庫中的狀態並更新數據庫中的唯一代碼。

如果同一用戶(用戶「A」)刷新「com_1」上的頁面,我們只需檢查會話中的唯一代碼並將其與數據庫進行匹配,這是肯定的不匹配,然後註銷並銷燬會話。

爲了保持用戶登錄,即使瀏覽器已關閉,您可以將cookie存儲在瀏覽器中,然後按照要求重新生成會話。

希望這會有所幫助。謝謝。

3

保留當前登錄的中央數據庫表或文本文件。如果用戶已在另一個會話中登錄,則通過將「登錄」標誌設置爲false來使該會話無效。

+0

我認爲這個想法是*允許*用戶登錄到另一個瀏覽器,並摧毀已經打開的會話。除非我誤解,否則您的想法是阻止新的登錄? – Mike 2010-07-02 09:32:36

+0

@Mike好點,會稍微更新一下答案。這兩件事情將很容易與中央註冊表。 – 2010-07-02 09:34:56

+0

@mike謝謝你的回覆。我的想法並不是阻止新的登錄,但是如果在同一臺計算機上的不同瀏覽器或不同計算機上的任何瀏覽器上發現同一用戶的新登錄,則會破壞現有會話。謝謝。 – davidlee 2010-07-02 10:42:06

5

您可以使用下面的算法

  1. 在DATABSE userLoggedInCount
  2. 在每次登錄時增量該標誌創建整型字段,並將結果保存在會話中。
  3. 在每個請求檢查在數據庫中的值,並將一個在會話中,並且如果所述一個會話中的小於一個在DB,invalidate()會話並在數據庫中減小數值
  4. 每當對話被破壞遞減價值以及

貸Bozho因爲他張貼了這個,回答一個問題 here

+0

是的。更多相同的情況。但在那裏找不到解決方案。 THKS。 – davidlee 2010-07-02 10:45:24

+0

@ben爲什麼不呢,有什麼問題? – 2010-07-02 10:47:15

+0

這個算法可能不夠。理論是完美的,但在實踐中,如果瀏覽器將會話保存在cookie中並將其從其恢復,它將不起作用。看看第2步。如果我如前所述瀏覽會自動恢復會話,它將不會通過任何LoginHandler或LoginMethod或任何可控地點執行該標誌的增量。如何在這種情況下行事? – ElPiter 2012-12-29 14:03:56

0

保存用戶的IP => SESSION_ID對在數據庫中。當用戶嘗試加載你的頁面時,你必須比較實際的IP => SESSION_ID對,然後允許/拒絕,如果這一對是好的/不同的。

3

我認爲你必須做這樣的事情:

  • 添加一個「last_session_id」列到你的用戶表
  • 當用戶登錄時,其當前的會話ID更新其last_session_id場
  • 如果用戶有認證會話,請檢查會話ID是否與數據庫中記錄的會話ID相同。如果不是,則銷燬此會話。