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

时间:2011-11-08 07:34:42

标签: javascript jquery backbone.js

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

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

  1. 用户打开浏览器标签A并转到网站并以#1用户身份登录。
  2. 用户打开浏览器标签B并转到网站。由于存在get_session API,脚本将在选项卡B上恢复会话。
  3. 用户从标签B退出,同时将标签A打开。
  4. 用户有时会忘记标签A,然后返回并与标签A互动。
  5. 选项卡A中的脚本尝试以#1用户身份获取新数据但遇到错误。
  6. 理想情况下,在步骤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的数据。的动臂即可。
    7. 是否有一种常见的做法可以防止出现这类问题?感谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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