2016-05-27 25 views
6

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

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

回答

1

一个相对简单的方式去使用SignalR的:当用户注销时,发送消息到同一用户的所有其他会话。

+0

是不是SignalR是C#(或.NET)特定的事情? –

+0

是的,SignalR是特定于asp.net的。如果使用其他后端,则可以使用Web套接字来执行相同的操作。 (如果浏览器支持,SignalR会使用websockets)。 –

0

简而言之:没有什么好的办法。

长的答案:

有很多的“结束会话”,甚至手段“结束会话”的方式,以及什么样的几个定义。

方式结束会话包括:

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

常用的有两种解决办法...

  • 有客户调查服务器每隔30-60秒就说我活着
  • 使用websockets,其中可以检测到关闭。
+0

对不起,也许我不清楚...如果我有不同的标签,我关闭其中一个会话将“继续”在其他人, 我在询问有关“注销”的明确用户操作。 – wizzy

+0

除非你有代码来中断其他会话,否则它们应该继续正常 –

2

服务器发送的事件是很好的处理方法。基于事件的处理是很好的,因为它像其他方法(检查cookie的存在),数据的持续轮询或者心跳类型的事物一样节省了资源。 所以任何方法,其中服务器可以消息客户端应用程序工作的东西(在你的情况下弹出模态通知注销会话)将尽最大努力。你也可以使用socket.io,这是很好的设计,可以很容易地做到这一点。

2

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

Detect If Browser Tab Has Focus

我觉得你有类似的问题。

3

当您使用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 Clientcmd.logout通知,如:

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