2010-08-31 56 views
0

我擁有爲我的web應用程序實現的一流的基於登錄的PHPSESSID機制。困擾我的一個方面是用戶在瀏覽器A中孤立他的會話(在計算機A上),在瀏覽器B中(在計算機B上)打開另一個瀏覽器,孤立它以回到瀏覽器A等等。可能所有這些都在PHPSESSID cookie有效的(合理冗長的)時間範圍內。如果兩個會話都顯示用戶靜態數據,並且用戶正在操作這些數據,那麼這兩個瀏覽器不一定會顯示與數據庫中數據一致的數據。如何管理跨瀏覽器的PHP會話

我對這種情況的首選迴應是第二次登錄兩次使第一次無效。我可以在數據庫中保留一個與userID關聯的PHPSESSID。這很簡單。現在最困難的部分是:在第二次登錄時,我如何使寫入數據庫的PHPSESSID失效,從而使第一次會話(現在失效的PHPSESSID)的後續訪問失敗?

(因爲要殺死第二PHPSESSID,一個我其實想保持我不能使用session_destroy()。我不能完全相同的理由使用setcookie()函數。)

我有一個想法涉及數據庫訪問序列號。每個新請求都會返回前一個加號。如果順序不正確,session_destroy()當前查詢者。我所看到的稍有不便之處在於,它需要額外的數據庫提取才能在每個用戶訪問之前恢復序列號。

是否有任何方法將此序列號與服務器緩存內某個用戶ID相關聯,該用戶ID不涉及任何cookie傳輸?

謝謝。

+3

我並不完全同意這首先是一個問題。如果用戶暫時處於非活動狀態,是不是一直有數據在服務器端發生變化的可能性?爲什麼要剝奪用戶使用他想要的任何瀏覽器的自由?用戶界面不應該更新問題嗎? – 2010-08-31 07:48:54

+0

不可以。數據不會自動改變。今天的家庭有這麼多電腦。用戶可以在他的桌面上打開一個會話,並在他的筆記本電腦上放置另一個會話。如果一個人不知道另一個,他們都會顯示垃圾。 (這是Ajax,我不刷新屏幕,會話只是向數據庫通知更新,應用程序的推測是它隨時知道數據庫的狀態,因爲它驅動所有更新,在登錄時記錄。) – Ollie2893 2010-08-31 07:54:57

回答

2

我完全不理解你的問題,但這是我該怎麼做的。

如果您將會話數據(包括SESSION_ID)存儲在數據庫中,並且將user_id添加到該表中,則可以在將PC B(由該用戶)啓動的新會話添加到該用戶的所有session_data之前刪除該用戶的所有session_data數據庫。當用戶嘗試在PC A上重新加載他/她的會話時,他/她的user_id和session_id的組合不存在,您應該將他/她註銷。

+0

公平點。更容易的計劃。仍然需要在每次訪問之前進行數據庫提取,但我認爲緩存的想法並沒有什麼好處:Web服務器維護文件系統上的所有會話數據。所以無論是文件系統訪問還是數據庫訪問。很多很多。兩者都可以維護內存緩存無論如何經常訪問的數據項... 我不認爲我可以按照您在句子1中描述的方式(無法訪問會話A的cookie)刪除會話數據。但是,我可以像刪除第2句中所描述的那樣刪除它(現在是正確的上下文A)。 – Ollie2893 2010-08-31 08:55:45

0

我沒有看到這個問題。
在第二次登錄時,您只需在數據庫中寫入第二個登錄會話標識。
這使前一個無效。