是否有通用的做法来跨浏览器窗口跟踪用户会话?

我正在编写一个本质上是客户端Web应用程序的网站,即页面上的所有内容都由脚本填充,其中包含来自ajax API的数据。 用户还将使用一组API登录和注销。

我的问题是如何处理以下(但不是非常极端)的用例:

  1. 用户打开浏览器选项卡A并转到网站并以#1用户身份登录。
  2. 用户打开浏览器选项卡B并进入网站。 由于存在get_session API,脚本会在选项卡B上恢复会话。
  3. 用户从选项卡B注销,同时将选项卡A打开。
  4. 用户有时会忘记选项卡A,然后返回并使用选项卡A进行交互。
  5. 选项卡A中的脚本尝试以用户#1的forms获取新数据但遇到错误。

理想情况下,在步骤3中应该有一些方法,当用户点击在标签B中注销时,标签A也会自动登出。

可以在步骤5中注销选项卡A(GMail这样做),但我认为应该有更好的方法。 即使在步骤5中检查也是非常重要的,因此对于这样的设计,每个API必须确切地知道脚本正在请求哪个用户的数据,否则下面的用例将产生不正确的输出。

(1-3)与上述相同。

  1. 用户打开浏览器选项卡A并转到网站并以#1用户身份登录。
  2. 用户打开浏览器选项卡B并进入网站。 由于存在get_session API,脚本会在选项卡B上恢复会话。
  3. 用户从选项卡B注销,同时将选项卡A打开。
  4. 用户再次从选项卡B登录,但这次是用户#2。
  5. 用户返回选项卡A并进行交互。 在认为用户是用户#1时,选项卡A中的脚本从API请求数据。
  6. API返回属于用户#2的数据。 繁荣

是否有一种常见的做法来防止这类问题? 谢谢。

蒂姆

ajax响应应指示用户已注销的错误情况; 在客户端,检测此错误并执行适当的操作。 显然这仅在存在ajax响应时才有效,因此您可能希望实现某种“听力”机制,即客户端每隔几秒就向服务器发送一次类似ping的ajax消息。 当您注销时,服务器将通过“用户注销”错误响应心跳,并且客户端可以进入“未登录”模式。

我不认为有,因为页面(标签)之间的这种通信将是一个重大的安全弱点。 但是,您可以通过让每个页面(选项卡)轮询服务器以查看会话是否仍然有效来实现相同的效果。 或者使用事件处理技术之一,例如iframe中的长轮询或流式传输。