You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular如何追踪浏览器刷新/重加载前时间以实现短时间登录态保留

Angular页面重加载短时保留登录态实现方案

核心逻辑说明

不需要追求完全精准的浏览器刷新触发时间,通过记录页面最后一次正常活跃的时间,配合本地存储做时间差校验即可实现需求。beforeunload事件是浏览器暴露的最接近页面刷新/关闭动作的触发节点,可基于此实现核心逻辑。

具体实现步骤

  • 监听页面卸载事件记录时间戳
    在Angular根组件(如AppComponent)的初始化钩子中注册beforeunload事件,事件触发时将当前时间写入本地存储:
    ngOnInit(): void {
      // 页面即将卸载时记录最后活跃时间
      window.addEventListener('beforeunload', () => {
        localStorage.setItem('lastAppActiveTime', Date.now().toString());
        // 可同步将加密后的登录态写入本地存储
      });
    }
    
  • 应用初始化时校验时间间隔
    应用启动时读取本地存储的时间戳,和当前时间做差值计算,符合阈值要求则直接恢复登录态:
    const lastActiveTime = localStorage.getItem('lastAppActiveTime');
    const RETENTION_VALID_MS = 10 * 1000; // 10秒有效期
    
    if (lastActiveTime) {
      const timeDiff = Date.now() - parseInt(lastActiveTime);
      if (timeDiff < RETENTION_VALID_MS) {
        // 时间校验通过,读取存储的加密登录态恢复登录
        const savedLoginInfo = localStorage.getItem('encryptedLoginInfo');
        if (savedLoginInfo) {
          // 调用自身业务的登录态恢复逻辑即可
        }
      } else {
        // 超过有效期,清除所有旧存储数据
        localStorage.removeItem('lastAppActiveTime');
        localStorage.removeItem('encryptedLoginInfo');
      }
    }
    
  • 兼容异常场景优化
    针对浏览器崩溃、进程强制结束等无法触发beforeunload的场景,可新增定时心跳更新活跃时间,保证记录的时间和实际卸载时间差值不会过大:
    // 每2秒更新一次活跃时间,异常场景下时间误差最多2秒,不影响10秒阈值的校验
    setInterval(() => {
      localStorage.setItem('lastAppActiveTime', Date.now().toString());
    }, 2000);
    

注意事项

  • 敏感登录信息不要明文存入本地存储,需做对称加密处理,降低XSS泄露风险
  • beforeunload事件中不要执行耗时同步操作,避免阻塞页面正常卸载

内容的提问来源于stack exchange,提问作者Felix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:15:00