检测标签

时间:2016-05-27 19:48:19

标签: javascript angularjs browser-tab

我正在开发一个可以在不同选项卡中打开的AngularJS webapp,我想知道哪个是检测用户何时在其中一个选项卡中注销的最佳方式;我想在其他选项卡中弹出一个登录模式窗口。 我正在考虑使用服务器发送的事件或跟踪我的服务器cookie的存在。 我从来没有做过这样的事情,所以我问的是我的选择有哪些优缺点,或者我错过了其他更聪明的方法。

编辑:在服务器上我有ServiceStack(C#)支持开箱即用的服务器发送事件

5 个答案:

答案 0 :(得分:3)

当您使用ServiceStack's Server Events时,您可以在用户退出时发送通知。

首先,您需要通过实施OnLogout Session or Auth Event来检测用户已注销,例如:

System.setProperty("webdriver.chrome.driver", "path + chromedriver.exe");
        ChromeDriver driver = new ChromeDriver();
        driver.get("http://popuptest.com/");
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

        String parentWindow = driver.getWindowHandle();
        System.out.println("Parent Window Session ID :" +parentWindow);
        driver.findElementByLinkText("Multi-PopUp Test #2").click();

        Set<String> allHandles = driver.getWindowHandles();
        System.out.println("Get All Windows :" +allHandles.size());
        for (String window: allHandles) {
        driver.switchTo().window(window);
        WebElement popwindow = driver.findElementByXPath("//body[@bgcolor='#00C957']");
          if(!window.equals(popwindow))
            {
            driver.close(); 
            System.out.println("Get Title" +driver.getTitle());
            System.out.println("Get Current URl" +driver.getCurrentUrl());*/
    }}

通过 UserId 通知会将通知发送到不同的标签以及用户登录的浏览器。如果您只想向1个浏览器中的所有标签发送通知,则可以使用而是public class MyAuthEvents : AuthEvents { public IServerEvents ServerEvents { get; set; } public override void OnLogout(IRequest httpReq, IAuthSession session, IServiceBase authService) { var channel = "home"; //replace with channel tabs are subscribed to var msg = "..."; ServerEvents.NotifyUserId(session.UserAuthId, "cmd.logout", msg, channel); } } API。

要使用ServiceStack注册AuthEvents处理程序,您只需在IOC中注册它,例如:

NotifySession(session.Id)

然后处理JavaScript ServerEvents Client中的 cmd.logout 通知,例如:

container.RegisterAs<MyAuthEvents, IAuthEvents>();

答案 1 :(得分:2)

服务器发送事件是处理此事件的好方法。基于事件的处理很好,因为它节省了资源,不像其他方法(如检查cookie的存在),或数据的持续轮询,或心跳类型的事物。 因此,任何服务器都可以通过消息通知客户端应用程序处理某些事情的方法(在您的情况下弹出一个模式通知已注销的会话)将做到最好。您也可以使用设计良好的socket.io,并且可以轻松完成。

答案 2 :(得分:2)

当您的标签获得焦点时,您可以检查一些Cookie或会话。如果您在一个选项卡中注销并切换到另一个选项卡,则活动选项卡将获得onfocuse事件。您可以检查是否仍有某些登录cookie或会话。

Detect If Browser Tab Has Focus

我认为你有类似的问题。

答案 3 :(得分:1)

一种相对简单的方法是使用SignalR:当用户注销时,向同一用户的所有其他会话发送消息。

答案 4 :(得分:0)

简短的回答:没有好办法。

答案很长:

有很多方法可以结束会话,以及结束会话的几种定义&#39;甚至意味着。

结束会议的方式包括:

  • 关闭标签
  • 导航
  • 关闭浏览器。
  • 强制关闭浏览器。
  • 拔掉互联网
  • 更改IP地址
  • 突然断电
  • 清理浏览器历史记录

常用两种解决方案......

  • 让客户每隔30-60秒轮询一次服务器,说我活着
  • 使用可检测关闭的websockets。