【问题标题】:How to detect whether the browser window has opened from another browser window?如何检测浏览器窗口是否已从另一个浏览器窗口打开?
【发布时间】:2015-04-02 07:40:37
【问题描述】:

我们正在开发 Java-Gwt Web 应用程序,我们有一个登录页面来访问该应用程序。最近我们面临 一种情况如下所述。

1) 用户在一个浏览器窗口(比如 Chrome)中打开应用程序,登录页面将显示给用户。 2) 用户再次在另一个浏览器窗口(例如 Chrome)中打开相同的应用程序,还会向用户显示登录页面。

在这里,用户输入登录凭据并从第一个浏览器窗口访问应用程序,然后用户再次输入 在第二个浏览器窗口中使用不同的登录凭据并访问应用程序。在这里,我们打开了两个不同的应用程序 2 个浏览器窗口中的凭据,即使浏览器实例相同。

如果我们像上面那样做,根据我们的实现,我们将进入不一致状态。

在上述情况下最好的方法是什么?

我在“Gmail”应用程序中观察到上述情况,如果用户登录第一个窗口,它会重新加载第二个窗口。

如果我们认为“Gmail”是一个很好的例子,如何在 GWT 或 JavaScript 中从第一个窗口检测第二个浏览器窗口?

任何建议都会很棒。

【问题讨论】:

  • 您是否尝试像 Gmail 一样支持同时使用多个帐户。对于在另一个窗口中检测登录,我认为它应该基于会话。如果第二个窗口可以异步检测到会话已创建,则可以在登录状态下重新加载页面
  • 是的,用户可以在同一个浏览器但不同的窗口中使用多个帐户登录,现在我们想让它像 gmail 应用程序一样。我们在显示登录页面之前创建会话。
  • 您是否无法跨窗口检测会话
  • @nitigyan,我们正在为我们的实现生成 2 个窗口的 2 个不同的会话 ID。
  • 如果您的会话存储在 cookie 中,则不应为同一浏览器的两个窗口获取两个会话 ID,除非其中一个窗口处于“隐身模式”(或类似模式)。如果您遇到这种行为,您的服务器端会话持久性就会被破坏。

标签: java javascript gwt web-applications browser


【解决方案1】:

好的,我误解了你的问题。所以你已经正确实现了 cookie/HTTP 会话,并且会发生以下情况:

  1. 用户在同一浏览器应用程序的两个浏览器窗口(或选项卡)中加载登录页面。单个 HTTP 会话(未经身份验证)和相应的浏览器 cookie 被创建(在第一次加载时)。
  2. 用户在第一个窗口中以用户 A 的身份登录,这会更新会话和 cookie 以反映用户 A 已登录。
  3. 然后用户在第二个窗口中以用户 B 的身份登录,这会更新会话和 cookie 以反映用户 A 已登录。
  4. 如果您的应用有用户特定的内容,用户 A 的数据仍会显示在第一个浏览器窗口中,但刷新页面或四处浏览会显示确实是用户 B 登录。

这种行为并不表示存在问题,但您希望能够检测到这种情况何时发生(或至少在第 1-3 步)。为此,我建议在身份验证后在会话/cookie 中存储有关用户的一些信息,例如 ID(您可能已经这样做了)。在 HTTP 会话/cookie 中设置此值时,首先检查其中是否已存在非空值。如果是这样,那么您已成功检测到上述情况。

所以在身份验证之后,像这样,其中请求是 HttpServletRequest:

    Integer userId = (Integer) request.getSession().getAttribute("userId");
    if (userId != null && userId != newlyAuthenticatedUserId) {
        System.out.println("Second login from same browser!");
    }
    request.getSession().setAttribute("userId", userId);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2020-05-11
    相关资源
    最近更新 更多