2010-04-29 66 views
0

我已經在PHP中實現了基於MySQL的會話接口。 我剛剛發現,如果我使用瀏覽器A(例如Chrome)登錄到我的帳戶,然後登錄到另一個瀏覽器B(​​例如IE)中的同一帳戶,則會爲每個瀏覽器分配2個單獨的會話ID。我該如何做到這一點,當我使用瀏覽器B重新登錄時,我保留了以前瀏覽器A的活動會話?相同的登錄用戶分配不同的會話ID(在不同的瀏覽器)

手頭的問題是,我在會話中存儲了某些信息,並且數據在不同瀏覽器中的相同用戶之間未同步,並且正在破壞。 :S

有沒有辦法做到這一點?

謝謝!

回答

2

如果要將會話存儲在數據庫中,請添加一種機制,將userId作爲數據庫會話記錄的一部分存儲,從而創建我喜歡稱爲「語義會話」的內容。用戶登錄時,檢查另一個會話是否已經存在;如果是這樣,請使用session_id()將新會話固定爲舊會話的ID,這會加入它們(並且應該爲所有後續請求更改新會話的ID)。請務必在登錄步驟中執行此操作,否則最終會出現兩次會話的奇怪競爭條件,試圖彼此相互「交換」。

+0

謝謝!我使用dbsession腳本來管理我的會話。我如何檢測用戶標識是否已經存儲爲數據庫會話記錄中另一個活動會話的一部分?我將用戶的用戶標識存儲在$ _SESSION ['用戶標識']中,但出現在表記錄session_data下。 – Lyon 2010-04-29 16:45:34

+0

您實際上必須修改存儲數據的表的模式;我的會話表,例如,設置了以下列:'sessid,userId,lastIp,sessData,sessBegan,sessLast'。這樣做只需關閉userId列即可。這將需要您的會話存儲引擎的一些定製。 – Dereleased 2010-04-29 17:15:12

+0

謝謝。我設法修改了我的表模式和會話存儲引擎。一個人認爲我做到這一點後意識到...我現在無法在登錄時重新生成會話ID。如果我這樣做,它會註銷其他瀏覽器。那現在是安全風險了嗎? – Lyon 2010-04-29 17:45:00

1

不要將數據存儲在會話中,將其存儲在數據庫中。

+0

會話存儲在數據庫中。但是因爲我想減少數據庫調用的次數,所以我在會話中存儲了一些數據。 例如該會話包含用於只讀目的的信息。所以我不需要再次調用數據庫來獲取這些數據。相反,只有更新/插入呼叫。 – Lyon 2010-04-29 16:32:39

+0

如果您想減少數據庫調用,請將該數據保存在緩存中。會話存儲默認情況下不是一種緩存。 – 2011-11-18 15:19:38

0

會話通常由cookie標識,cookie只在一個瀏覽器中可見。你可能可以使用Flash來分享瀏覽器之間的會話ID,但我想不出一個用例。會話的重點是存儲綁定到單個瀏覽會話的數據,而不是一般用戶。您應該爲通用用戶數據使用數據庫或其他形式的服務器端存儲。

+0

我正在使用數據庫來存儲通用用戶數據,但即時通訊也存儲在會話表中的一些基本統計數據,所以當通過ajax輪詢時,腳本將只從會話表中獲取它,並避免過度的數據庫調用。 – Lyon 2010-04-29 16:49:11

相關問題