2010-05-15 78 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"]; 
    //... 
}