【问题标题】:asp.net - session - multiple browser tabs - different sessions?asp.net - 会话 - 多个浏览器选项卡 - 不同的会话?
【发布时间】:2011-02-19 21:39:04
【问题描述】:

我想为每个浏览器标签维护一个会话状态。

在 ASP.NET 中这很容易(甚至可能)吗?

示例:用户在 Firefox 中按 Ctrl-T 5 次,然后在每个选项卡中访问该站点。我希望每个选项卡在服务器上都有自己的会话状态

【问题讨论】:

    标签: asp.net iis session


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      为了方便一个用户的多标签会话状态而不使 URL 混乱,请执行以下操作。

      在您的表单加载功能中,包括:

      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 确实提供了比使用隐藏输入字段更多的保护。
      • 在 PostBack 恢复 ViewState 之前,您将无法访问 PageID。因此,您将无法访问 page_init() 处理程序中的 PageID。

      【讨论】:

      • 对于使用 ASP.NET Web 表单的开发人员,您可以通过使用 ViewState 而不是本机 HTML 隐藏字段来获得一定程度的保护,防止恶意用户篡改 PageID。默认情况下,ViewState 使用服务器机器密钥进行散列,如果发布的数据不是有效的散列,则 ASP.NET 会引发异常。如果会话 ID 被篡改,这通常会导致在将下一个数据写入其中时创建一个新会话,因为现有会话将无效 - 尝试调用现有数据将导致空引用异常。可以检查这些或 IsNewSession 属性。
      • @pwdst 好点,我会调整解决方案来匹配!谢谢
      • 这是我本周必须处理的工作数据完整性问题的一个很好的解决方案。用户打开第二个选项卡,然后返回以更新第一个选项卡中保存的记录,当然会话数据与第二个记录相关联。我使用了这个解决方案的一个变体来防止对错误记录的错误更新。
      • 使用隐藏字段可能会更好(或另外),以使 javascript 访问更简单(例如,如果您必须将值发送到 WebMethod,等等),不是吗?
      • 当前上下文中不存在名称“ViewState”。是显示@GeorgeWBush 的错误
      【解决方案3】:
      <configuration>
        <system.web>
          <sessionState cookieless="true"
            regenerateExpiredSessionId="true" />
        </system.web>
      </configuration>
      

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

      在这种情况下,每个标签都会获得唯一的 ID,并且看起来就像是另一个访问者。

      【讨论】:

      • cookieless="true" 真的需要吗?
      • @Ertürk Öztürk:这个问题听起来“我想为每个浏览器选项卡维护一个会话状态。”。所有浏览器实例共享相同的 cookie。
      • @zerkms 我对 cookieless 没问题,但我需要在页面加载时动态设置它。不幸的是它是只读的。
      • @ErtürkÖztürk 我的建议是,如果你有一个单独的问题。
      • 注意:如果用户从一个选项卡复制 URL 并将其粘贴到另一个选项卡,这将不起作用。由于会话基于 URL 中的键,因此两个选项卡现在将使用相同的会话。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      相关资源
      最近更新 更多