Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在浏览器关闭的情况下检查会话是否仍然存在_Node.js_Angular_Express Session_Session Storage - Fatal编程技术网

Node.js 如何在浏览器关闭的情况下检查会话是否仍然存在

Node.js 如何在浏览器关闭的情况下检查会话是否仍然存在,node.js,angular,express-session,session-storage,Node.js,Angular,Express Session,Session Storage,以下是我的场景:在登录到应用程序后,在下一个浏览器窗口打开时-用户已经通过身份验证(使用express session),它直接进入内容页(不通过登录页)。这种行为将在下一个浏览器窗口打开时继续。 现在-问题-我需要确定最后一个浏览器窗口何时关闭-以便清除会话。 我正在寻找某种方法来检查用户是否关闭了最后一个(经过身份验证的)浏览器窗口。 我假设这可以通过会话存储来实现,但不知道如何进行调查 您应该使用在客户端维护身份验证的标准方法 快乐编码…:) 在路由中添加canActivate: cons

以下是我的场景:在登录到应用程序后,在下一个浏览器窗口打开时-用户已经通过身份验证(使用express session),它直接进入内容页(不通过登录页)。这种行为将在下一个浏览器窗口打开时继续。 现在-问题-我需要确定最后一个浏览器窗口何时关闭-以便清除会话。
我正在寻找某种方法来检查用户是否关闭了最后一个(经过身份验证的)浏览器窗口。 我假设这可以通过会话存储来实现,但不知道如何进行调查

您应该使用在客户端维护身份验证的标准方法


快乐编码…:)

在路由中添加
canActivate

const routes: Routes = [
  { path: 'login', component: LoginComponent },
  {
    path: 'dashboard', 
    loadChildren: './master/master.module#MasterModule',
    canActivate: [AppRouteGuard]
  },
  { path: '**', component: NotFoundComponent }
];
并创建一个认可的监护服务,如下所示:

export class AppRouteGuard implements CanActivate {

    constructor(private router: Router) { }

    canActivate(route: ActivatedRouteSnapshot): Observable<boolean> | Promise<boolean> | boolean {

        if (localStorage.getItem('loginData') != null ) {
            return true;
        } else {
            this.router.navigate(['/login'])
            return false;
        }
    }
}
导出类AppRouteGuard实现可激活{
构造函数(专用路由器:路由器){}
canActivate(路由:ActivatedRouteSnapshot):可观察的|承诺|布尔值{
if(localStorage.getItem('loginData')!=null){
返回true;
}否则{
this.router.navigate(['/login'])
返回false;
}
}
}

试试下面的方法。我不是100%确定它能满足所有情况,可能有一些边缘情况需要单独处理

  • 在服务器端生成一个tabId,存储它并将其作为标题发送到浏览器选项卡
  • 选项卡将读取此内容(在JS中)并将其分配给局部变量
  • 选项卡应将其与每个请求一起发送到服务器
  • 当tab关闭时,调用服务器以通知tabId已关闭
  • 如果在请求中找不到tabId,服务器应该设置一个新的tabId
  • 关闭给定会话的最后一个选项卡ID后,注销服务器上的会话

  • 我已经使用计数器实现了以上所有功能。主要和唯一的问题是第4节:无法识别标签是关闭事件窗口:刷新页面时卸载是触发事件。好的……考虑页面刷新,因为新标签可能是…关闭旧的选项卡ID并创建新的选项卡ID并将其发送到浏览器?您尝试过解决方案吗?是的,问题是当浏览器关闭并打开新的选项卡ID时,本地存储会保留值事件