我想維護每個瀏覽器選項卡的會話狀態。asp.net - 會話 - 多個瀏覽器標籤 - 不同的會話?
在ASP.NET中這很容易(甚至可能)嗎?
示例:用戶在firefox中點擊Ctrl-T 5次並訪問每個選項卡中的網站。我想每個標籤具有在這種情況下,服務器
我想維護每個瀏覽器選項卡的會話狀態。asp.net - 會話 - 多個瀏覽器標籤 - 不同的會話?
在ASP.NET中這很容易(甚至可能)嗎?
示例:用戶在firefox中點擊Ctrl-T 5次並訪問每個選項卡中的網站。我想每個標籤具有在這種情況下,服務器
爲了方便一個用戶的多選項卡會話狀態而不會混淆網址,請執行以下操作。
在您的形式加載功能,包括:
If Not IsPostback Then
'Generate a new PageiD'
ViewState("_PageID") = (New Random()).Next().ToString()
End If
當你保存的東西您的會話狀態,包括PAGEID:
Session(ViewState("_PageID").ToString() & "CheckBoxes") = D
注意:
<configuration>
<system.web>
<sessionState cookieless="true"
regenerateExpiredSessionId="true" />
</system.web>
</configuration>
http://msdn.microsoft.com/en-us/library/ms178581.aspx
自身的會話狀態的每個選項卡將獲得唯一的ID,它會看起來是另一個訪問者。
使用Brian Webster的回答我發現XMLHttpRequests有問題。事實證明,XMLHttpRequests沒有將IsPostback
標誌設置爲true,因此該請求看起來像是一個新的請求,並且最終會爲該請求建立新的會話狀態。爲了解決這個問題,我也查的ViewState("_PageID")
,使我的代碼看起來像這樣在C#中的值:
protected dynamic sessionVar; //a copy of the session variable
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack && ViewState["_PageID"] == null)
{
ViewState["_PageID"] = (new Random()).Next().ToString();
Session[ViewState["_PageID"] + "sessionVar"] = initSessionVar(); //this function should initialize the session variable
}
sessionVar = Session[ViewState["_PageID"] + "sessionVar"];
//...
}
對於使用ASP.NET Web窗體的開發人員,您可以通過使用ViewState而不是本機HTML隱藏字段來防止惡意用戶篡改PageID。默認情況下,ViewState與服務器機器密鑰進行散列處理,如果發佈的數據不是有效散列,則ASP.NET將引發異常。如果會話ID被篡改,通常會導致在向其寫入下一個數據時創建新會話,因爲現有會話將無效 - 嘗試調用現有數據會導致空參考例外。可以檢查這些或IsNewSession屬性。 – pwdst 2013-02-13 23:55:14
@pwdst優秀點,我會調整解決方案以匹配!謝謝 – 2013-02-14 00:03:25
這是一個很好的解決方案,我不得不在本週處理數據完整性問題。用戶正在打開第二個選項卡,然後返回以更新第一個選項卡中保存的記錄,當然還有與第二個記錄關聯的會話數據。我使用了此解決方案的一個變體來防止錯誤記錄上的錯誤更新。 – pwdst 2013-02-14 00:20:20