特定用户Local Storage被清空其余用户不受影响的问题排查
问题根因定位
你当前的问题核心出在Auth Guard的过期时间校验逻辑上,和Mac系统的日期解析规则强相关,完全匹配你描述的仅特定Mac用户出问题、无报错、跳转即清token的现象:
- 代码中直接调用
new Date(exTime.toString())做时间比较,不同系统、不同区域设置对非标准日期字符串的解析逻辑存在天然差异:- Windows对常见的含斜杠、横杠的日期格式兼容性较高,通常不会解析失败
- 你测试用的Mac设备大概率默认是中国大陆区域设置,对常用日期格式适配性高,而问题用户的Mac可能调整为英文区、港澳台区等其他区域,若后端返回的
token.expires是不带时区标识的字符串(比如2024-05-20 12:00:00格式),会直接解析出Invalid Date,和当前时间比较时结果为false,直接触发清空token的逻辑,形成跳转循环。
可直接落地的排查和修复方案
- 先快速验证根因:让问题用户在开发者控制台执行
new Date(你的token里expires字段的示例值),如果返回结果是Invalid Date即可100%确认问题 - 优先修复时间校验逻辑:
- 最优方案:让后端返回13位毫秒级时间戳作为过期时间,无需做日期字符串解析,直接用数字比较即可,从根源避免跨系统解析问题:
// 优化后逻辑,exTime为时间戳数字 if (token.expires > Date.now()) { return true; } - 若无法修改后端返回格式,统一用手动解析逻辑替代原生
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; }
- 最优方案:让后端返回13位毫秒级时间戳作为过期时间,无需做日期字符串解析,直接用数字比较即可,从根源避免跨系统解析问题:
- 低概率排查方向:
- 问题用户开启了浏览器的关闭时自动清除站点数据功能,且刚好将你的站点加入了自动清理列表
- 问题用户安装了特定的广告拦截/隐私保护插件,针对你站点的Local Storage配置了自动清理规则
- 站点存在多域名/子域名跳转逻辑,Local Storage的作用域和跳转后的域名不匹配,导致读取不到token触发清理逻辑
内容的提问来源于stack exchange,提问作者jtslugmaster08
相关产品推荐
相关产品推荐

