我正在开发一个可以在不同选项卡中打开的 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。