【问题标题】:how to check if session is still exists in case browser was closed如果浏览器关闭,如何检查会话是否仍然存在
【发布时间】:2020-03-07 05:20:58
【问题描述】:

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

【问题讨论】:

  • 你试过解决方案了吗?
  • 是的,问题是本地存储在关闭浏览器并打开新浏览器时维护value事件

标签: node.js angular express-session session-storage


【解决方案1】:

您应该使用angular auth guard,这是在客户端维护身份验证的标准方式。

编码愉快... :)

【讨论】:

    【解决方案2】:

    在路由中添加canActivate

    const routes: Routes = [
      { path: 'login', component: LoginComponent },
      {
        path: 'dashboard', 
        loadChildren: './master/master.module#MasterModule',
        canActivate: [AppRouteGuard]
      },
      { path: '**', component: NotFoundComponent }
    ];
    

    并像这样创建 AppRouteGuard 服务

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

    【讨论】:

      【解决方案3】:

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

      1. 在服务器端生成一个tabId,将其存储并作为标题发送到浏览器选项卡。
      2. Tab 将读取这个(在 JS 中)并将其分配给一个局部变量
      3. Tab 应该将它与每个请求一起发送到服务器
      4. tab关闭时,调用服务器通知tabId关闭
      5. 如果请求中没有找到tabId,服务器应该设置一个新的tabId
      6. 当给定会话的最后一个 tabId 关闭时,注销服务器上的会话

      【讨论】:

      • 我已经使用计数器实现了上述所有功能。主要也是唯一的问题是第 4 节:无法识别选项卡已关闭 - 事件窗口:刷新页面时触发卸载事件。
      • 好的....所以考虑刷新页面,因为新标签可能是...关闭旧的tabId并创建新的tabId并将其发送到浏览器?
      猜你喜欢
      • 2015-02-21
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 2019-02-02
      • 2018-04-27
      • 1970-01-01
      相关资源
      最近更新 更多