2010-05-15 75 views

回答

20

爲了方便一個用戶的多選項卡會話狀態而不會混淆網址,請執行以下操作。

在您的形式加載功能,包括:

If Not IsPostback Then 
    'Generate a new PageiD' 
    ViewState("_PageID") = (New Random()).Next().ToString() 
End If 

當你保存的東西您的會話狀態,包括PAGEID:

Session(ViewState("_PageID").ToString() & "CheckBoxes") = D 

注意

  • 作爲通常使用會話ID,您不能相信惡意觀看者不會改變SessionID/PageID。對於所有用戶都可以信任的環境來說,這只是一個有效的解決方案。幸運的是,ViewState確實提供了比使用隱藏輸入字段更多的保護。
  • 直到ViewState在PostBack上恢復時,您才能訪問PageID。因此,您將無法訪問page_init()處理程序中的PageID。
+1

對於使用ASP.NET Web窗體的開發人員,您可以通過使用ViewState而不是本機HTML隱藏字段來防止惡意用戶篡改PageID。默認情況下,ViewState與服務器機器密鑰進行散列處理,如果發佈的數據不是有效散列,則ASP.NET將引發異常。如果會話ID被篡改,通常會導致在向其寫入下一個數據時創建新會話,因爲現有會話將無效 - 嘗試調用現有數據會導致空參考例外。可以檢查這些或IsNewSession屬性。 – pwdst 2013-02-13 23:55:14

+0

@pwdst優秀點,我會調整解決方案以匹配!謝謝 – 2013-02-14 00:03:25

+2

這是一個很好的解決方案,我不得不在本週處理數據完整性問題。用戶正在打開第二個選項卡,然後返回以更新第一個選項卡中保存的記錄,當然還有與第二個記錄關聯的會話數據。我使用了此解決方案的一個變體來防止錯誤記錄上的錯誤更新。 – pwdst 2013-02-14 00:20:20

14
<configuration> 
    <system.web> 
    <sessionState cookieless="true" 
     regenerateExpiredSessionId="true" /> 
    </system.web> 
</configuration> 

http://msdn.microsoft.com/en-us/library/ms178581.aspx

自身的會話狀態的每個選項卡將獲得唯一的ID,它會看起來是另一個訪問者。

+0

無Cookie =「true」是真正需要的? – ErTR 2015-01-26 19:20:37

+0

@ErtürkÖztürk:這個問題聽起來「我想保持每個瀏覽器選項卡的會話狀態。」。所有瀏覽器實例共享相同的cookie。 – zerkms 2015-01-26 20:29:19

+0

@zerkms我沒有cookieless,但我需要在頁面加載時動態設置它。不幸的是它是隻讀的。 – ErTR 2015-01-26 20:35:14

0

使用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"]; 
    //... 
}