如何检测浏览器窗口是否已从其他浏览器窗口打开?

时间:2015-02-03 07:17:18

标签: java javascript gwt web-applications browser

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

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

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

如果我们确实如此,我们将按照我们的实施进入不一致状态。

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

我观察过Gmail'应用上述情况,如果用户登录第一个窗口,则重新加载第二个窗口。

如果我们考虑使用Gmail'如何从GWT或JavaScript中的第一个窗口检测第二个浏览器窗口是一个很好的例子吗?

任何建议都会很棒。

1 个答案:

答案 0 :(得分:0)

好的,我误解了你的问题。因此,您正确实施了cookie / HTTP会话,并发生以下情况:

  1. 用户在同一浏览器应用程序的两个浏览器窗口(或选项卡)中加载登录页面。创建单个HTTP会话(未经身份验证的)和相应的浏览器cookie(在第一次加载时)。
  2. 用户在第一个窗口中以用户A身份登录,该窗口更新会话和cookie以反映用户A已登录。
  3. 用户然后在第二个窗口中以用户B身份登录,更新会话和cookie以反映用户A已登录。
  4. 如果您的应用具有特定于用户的内容,则用户A的数据仍将显示在第一个浏览器窗口中,但刷新页面或浏览将显示用户B确实已登录。
  5. 这种行为都没有表明存在问题,但您希望能够检测到这种情况何时发生(或至少步骤1-3)。为此,我建议在身份验证后在会话/ cookie中存储有关用户的内容,例如ID(您可能已经这样做了)。在HTTP会话/ cookie中设置此值时,首先检查其中是否已存在非空值。如果是这样,那么您已成功检测到上述方案。

    所以经过身份验证之后,就像这样,其中request是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);