【问题标题】:Different session data for each browser tab每个浏览器选项卡的不同会话数据
【发布时间】:2013-12-28 01:30:02
【问题描述】:

通常,HTTP 服务器端会话数据存储(例如 PHP 中的 $_SESSION)是使用 cookie 实现的 - 每个客户端都有一个存储在 cookie 中的唯一会话 ID。服务器接收此 cookie 并使用它查找会话数据(作为某种密钥或文件名)。

这很好用,但有时会导致问题,因为 cookie(以及会话)在浏览器选项卡之间共享。

我的问题是:是否可以实现一个服务器端数据存储,为每个浏览器选项卡保存不同的数据? 最好的方法是什么?没有客户端 JavaScript。


示例:您有某种非常复杂的表单,其中包含多个步骤,并且您希望在将所有内容写入数据库之前将之前步骤中的数据存储在某个地方。您可以将数据存储到会话中,但如果有人在多个浏览器选项卡中使用相同的表单,这将无法正常工作 - 因为会话数据将被共享。因此,最好为每个选项卡设置不同的存储空间。

示例 #2:您希望允许用户在同一个浏览器中登录多个帐户。所以你需要某种会话的“分叉”机制。

【问题讨论】:

    标签: http session cookies web


    【解决方案1】:

    但如果有人在多个浏览器选项卡中使用相同的表单,这将无法正常工作 - 因为会话数据将被共享

    为什么您不想在设置或获取另一包数据之前检查 SESSION 数组中的数据(验证)?

    但我认为,更好的方法是在服务器端验证之前使用客户端存储(例如 LocalStorage)来设置一些数据。对于此类数据的高负载项目服务器端存储并不好。如果客户端数据可以存储在客户端 - 应该这样做。

    当用户重新打开表单的第二步并重新输入数据时,您会说什么? (+ 对服务器的请求,++ 服务器负载)

    【讨论】:

      【解决方案2】:

      最好不要依赖会话状态,而是将数据存储在服务器端的临时存储中,并在表单的隐藏字段中包含一个键。

      该键在向导的第一个屏幕(即第一个表单)中获取其值,并在屏幕之间传递。那么无论用户打开了多少个选项卡,每个选项卡都会在表单中嵌入自己的唯一键。

      即使您想在客户端存储表单数据,您也可以使用它,尽管它更复杂。 Cookie 具有名称,因此您可以使用每个表单的唯一 ID 作为 cookie 名称,然后将值存储在 cookie 中。当然你必须确保cookie大小不会超过4K。

      【讨论】:

      • 谢谢。对于带有向导表单的示例,这可能是一个很好的解决方案,但最初的问题仍然适用(尽管它可能有点假设)。
      • 我不认为这是可能的,因为它是由客户端(由浏览器)确定是否跨选项卡共享 cookie。
      • 您可以尝试为每个选项卡使用不同的子域,这比解决方案更有效...
      猜你喜欢
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2013-02-12
      相关资源
      最近更新 更多