6

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

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

4

5 回答 5

3

当您使用ServiceStack 的服务器事件时,您可以在用户注销时发送通知。

首先,您需要通过实现 OnLogout Session 或 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。

要将您的 AuthEvents 处理程序注册到 ServiceStack,您只需在 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
    }
});
于 2016-05-27T20:31:55.990 回答
2

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

检测浏览器选项卡是否有焦点

我认为你有类似的问题。

于 2016-05-27T20:13:07.500 回答
2

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

于 2016-05-27T20:01:48.387 回答
1

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

于 2016-05-27T19:51:13.250 回答
0

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

长答案:

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

结束会话的方法包括:

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

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

  • 让客户端每 30-60 秒轮询一次服务器,说我还活着
  • 使用 websockets,它可以检测关闭。
于 2016-05-27T19:53:55.717 回答