【问题标题】:Detect session end between tabs检测选项卡之间的会话结束
【发布时间】:2016-09-26 06:00:55
【问题描述】:

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

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

【问题讨论】:

    标签: javascript angularjs browser-tab


    【解决方案1】:

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

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

    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);
        }
    }
    

    UserId 通知会将通知发送到不同的选项卡以及用户登录的浏览器。如果您只想将通知发送到仅 1 个浏览器中的所有选项卡,您可以使用NotifySession(session.Id) API 代替。

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

    container.RegisterAs<MyAuthEvents, IAuthEvents>();
    

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

    $(source).handleServerEvents({
        handlers: {
            logout: function (msg) {
                //Show AngularJS dialog
                $mdDialog.alert({
                    title: 'Attention',
                    textContent: msg,
                    ok: 'Close'
                });
            },
            //... Other custom handlers
        }
    });
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        Detect If Browser Tab Has Focus

        我认为你有类似的问题。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • SignalR 不是 C#(或 .NET)特定的东西吗?
          • 是的,SignalR 是特定于 asp.net 的。如果使用其他后端,您可以使用 Web 套接字来做同样的事情。 (如果浏览器支持,SignalR 在后台使用 websockets)。
          【解决方案5】:

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

          长答案:

          有很多“结束会话”的方式,以及“结束会话”甚至意味着什么的几种定义。

          结束会话的方式包括:

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

          常用的解决方案有两种……

          • 让客户端每 30-60 秒轮询一次服务器以确认我还活着
          • 使用可以检测关闭的 websocket。

          【讨论】:

          • 对不起,也许我不清楚...如果我有不同的选项卡并关闭其中一个选项卡,会话将在其他选项卡上“继续”,我在询问明确的用户操作“注销”。
          • 除非您有代码可以中断其他会话,否则它们应该会继续正常
          猜你喜欢
          • 2011-09-08
          • 2015-06-29
          • 2015-04-11
          • 1970-01-01
          • 2019-01-17
          • 1970-01-01
          • 2019-04-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多