如何检测浏览器窗口是否已从另一个浏览器窗口打开

How to detect whether the browser window has opened from another browser window?

本文关键字:窗口 浏览器 另一个 是否 何检测 检测      更新时间:2023-09-26

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

1)用户

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

在这里,用户输入

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

如果我们像上面一样,我们将按照我们的实现进入不一致状态。

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

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

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

任何建议都会很棒。

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

    用户在同一浏览器
  1. 应用程序的两个浏览器窗口(或选项卡)中加载登录页面。 创建单个 HTTP 会话(未经身份验证)和相应的浏览器 Cookie(在第一次加载时)。
  2. 用户
  3. 在第一个窗口中以用户 A 身份登录,这将更新会话和 Cookie 以反映用户 A 已登录。
  4. 然后,用户在第二个窗口中以用户 B 身份登录,该窗口将更新会话和 cookie 以反映用户 A 已登录。
  5. 如果您的应用包含特定于用户的内容,则用户 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);