我正在开发一个AngularJS webapp,它可以在不同的标签中打开,我想知道哪些是检测用户何时在其中一个标签中注销的最佳方式;我想在其他选项卡中弹出一个登录模式窗口。 我正在考虑使用服务器发送的事件或跟踪我的服务器cookie的存在。 我从来没有做过这样的事情,所以我问我的选择有什么优点或缺点,或者如果我错过了其他更聪明的方式来做到这一点。在标签之间检测会话结束
编辑:在服务器上我有ServiceStack(C#),支持服务器发送的事件开箱
我正在开发一个AngularJS webapp,它可以在不同的标签中打开,我想知道哪些是检测用户何时在其中一个标签中注销的最佳方式;我想在其他选项卡中弹出一个登录模式窗口。 我正在考虑使用服务器发送的事件或跟踪我的服务器cookie的存在。 我从来没有做过这样的事情,所以我问我的选择有什么优点或缺点,或者如果我错过了其他更聪明的方式来做到这一点。在标签之间检测会话结束
编辑:在服务器上我有ServiceStack(C#),支持服务器发送的事件开箱
一个相对简单的方式去使用SignalR的:当用户注销时,发送消息到同一用户的所有其他会话。
简而言之:没有什么好的办法。
长的答案:
有很多的“结束会话”,甚至手段“结束会话”的方式,以及什么样的几个定义。
方式结束会话包括:
常用的有两种解决办法...
对不起,也许我不清楚...如果我有不同的标签,我关闭其中一个会话将“继续”在其他人, 我在询问有关“注销”的明确用户操作。 – wizzy
除非你有代码来中断其他会话,否则它们应该继续正常 –
服务器发送的事件是很好的处理方法。基于事件的处理是很好的,因为它像其他方法(检查cookie的存在),数据的持续轮询或者心跳类型的事物一样节省了资源。 所以任何方法,其中服务器可以消息客户端应用程序工作的东西(在你的情况下弹出模态通知注销会话)将尽最大努力。你也可以使用socket.io,这是很好的设计,可以很容易地做到这一点。
当标签获得焦点时,您可以检查一些cookie或会话。如果您注销一个选项卡并切换到另一个选项卡,则活动选项卡会发生onfocuse事件。你可以检查一些登录cookie或会话是否仍然存在。
Detect If Browser Tab Has Focus
我觉得你有类似的问题。
当您使用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);
}
}
通知由用户ID将通知发送给不同的标签以及浏览器在用户登录如果您只想在1浏览器中向所有选项卡发送通知,则可以使用NotifySession(session.Id)
API。
要注册AuthEvents处理器与ServiceStack你只需要在国际奥委会注册,如:
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
}
});
是不是SignalR是C#(或.NET)特定的事情? –
是的,SignalR是特定于asp.net的。如果使用其他后端,则可以使用Web套接字来执行相同的操作。 (如果浏览器支持,SignalR会使用websockets)。 –