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

特定用户Local Storage被清空其余用户不受影响的问题排查

问题根因定位

你当前的问题核心出在Auth Guard的过期时间校验逻辑上,和Mac系统的日期解析规则强相关,完全匹配你描述的仅特定Mac用户出问题、无报错、跳转即清token的现象:

  • 代码中直接调用new Date(exTime.toString())做时间比较,不同系统、不同区域设置对非标准日期字符串的解析逻辑存在天然差异:
    1. Windows对常见的含斜杠、横杠的日期格式兼容性较高,通常不会解析失败
    2. 你测试用的Mac设备大概率默认是中国大陆区域设置,对常用日期格式适配性高,而问题用户的Mac可能调整为英文区、港澳台区等其他区域,若后端返回的token.expires是不带时区标识的字符串(比如2024-05-20 12:00:00格式),会直接解析出Invalid Date,和当前时间比较时结果为false,直接触发清空token的逻辑,形成跳转循环。

可直接落地的排查和修复方案

  • 先快速验证根因:让问题用户在开发者控制台执行new Date(你的token里expires字段的示例值),如果返回结果是Invalid Date即可100%确认问题
  • 优先修复时间校验逻辑:
    1. 最优方案:让后端返回13位毫秒级时间戳作为过期时间,无需做日期字符串解析,直接用数字比较即可,从根源避免跨系统解析问题:
      // 优化后逻辑,exTime为时间戳数字
      if (token.expires > Date.now()) { 
        return true;
      }
      
    2. 若无法修改后端返回格式,统一用手动解析逻辑替代原生new Date()解析非标准字符串:
      // 示例:兼容解析YYYY-MM-DD HH:mm:ss格式的字符串
      function parseDate(dateStr: string) {
        const [datePart, timePart] = dateStr.split(' ');
        const [year, month, day] = datePart.split(/[-\/]/).map(Number);
        const [hour, minute, second] = timePart.split(':').map(Number);
        return new Date(year, month - 1, day, hour, minute, second).getTime();
      }
      // 校验逻辑替换为
      if (parseDate(exTime.toString()) > Date.now()) {
        return true;
      }
      
  • 低概率排查方向:
    • 问题用户开启了浏览器的关闭时自动清除站点数据功能,且刚好将你的站点加入了自动清理列表
    • 问题用户安装了特定的广告拦截/隐私保护插件,针对你站点的Local Storage配置了自动清理规则
    • 站点存在多域名/子域名跳转逻辑,Local Storage的作用域和跳转后的域名不匹配,导致读取不到token触发清理逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:39:00