检测选项卡之间的会话结束



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

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

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

首先,您需要通过实现 OnLogout 会话或身份验证事件来检测用户是否已注销,例如:

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

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

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

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

我想你有类似的问题。

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

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

长答案:

有很多方法可以"结束会话"

,以及"结束会话"的含义的几种定义。

结束会话的方法包括:

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

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

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

相关内容

  • 没有找到相关文章