Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测浏览器窗口是否已从其他浏览器窗口打开?_Java_Javascript_Gwt_Web Applications_Browser - Fatal编程技术网

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

Java 如何检测浏览器窗口是否已从其他浏览器窗口打开?,java,javascript,gwt,web-applications,browser,Java,Javascript,Gwt,Web Applications,Browser,我们正在开发JavaGWTWeb应用程序,我们有一个登录页面来访问该应用程序。最近我们面临着 下面描述的一个场景 1) 用户在一个浏览器窗口(比如Chrome)中打开应用程序,登录页面将显示给用户。 2) 用户再次在另一个浏览器窗口(比如Chrome)中打开同一个应用程序,登录页面也会显示给用户 在这里,用户输入登录凭据并从第一个浏览器窗口访问应用程序,然后再次输入 在第二个浏览器窗口中显示不同的登录凭据并访问应用程序。在这里,我们已经打开了两个不同的应用程序 两个浏览器窗口中的凭据,即使浏览器

我们正在开发JavaGWTWeb应用程序,我们有一个登录页面来访问该应用程序。最近我们面临着 下面描述的一个场景

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

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

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

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

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

如果我们考虑Gmail是一个很好的例子,那么如何从GWT或JavaScript中的第一个窗口检测第二个浏览器窗口?
任何建议都很好。

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

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

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