我想维护每个浏览器选项卡的会话状态。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