2.9 KiB
2.9 KiB
✅ Token 存储降级方案 - 修复说明
📌 问题描述
现象: 本地调试正常,但在其他电脑上登录后 localStorage.leasToken 没有存储成功。
根本原因: 项目使用了 AES-GCM 加密存储,依赖 Web Crypto API,在 HTTP 环境或旧版浏览器中不可用。
✅ 修复方案
实现了三层降级存储策略,确保在任何环境下都能正常存储 token:
优先: AES-GCM 加密存储 (HTTPS + 现代浏览器)
↓ 失败自动降级
降级: 明文 JSON 存储 (HTTP 环境/旧浏览器)
↓ 失败保底
保底: 内存缓存 (至少当前会话可用)
🔧 修改的文件
核心修复:
- src/utils/request.js - Token 管理逻辑
initTokenCache()- 智能读取(加密→明文→内存)updateToken()- 智能存储(加密→明文→内存)clearToken()- 完全清除(加密+明文+内存)
📊 兼容性
| 环境 | 存储方式 | 状态 |
|---|---|---|
| HTTPS + 现代浏览器 | ✅ AES-GCM 加密 | 最安全 |
| HTTP 环境 | ⚠️ 明文 JSON | 自动降级 |
| 旧版浏览器 (IE11/360兼容模式) | ⚠️ 明文 JSON | 自动降级 |
| 隐私模式 | 💾 内存缓存 | 会话内可用 |
🧪 验证方法
开发环境测试
npm run serve
登录后在浏览器控制台检查:
// 检查是否存储成功
console.log('Token 已存储:', !!localStorage.getItem('leasToken'));
// 查看存储模式(开发环境会有日志)
// HTTPS: [Token缓存] ✅ 已保存到加密存储
// HTTP: [Token缓存] ✅ 已保存到明文存储(降级模式)
测试登录持久化
// 1. 登录后刷新页面
location.reload();
// 2. 应该保持登录状态,不需要重新登录
在问题电脑上验证
- 清除旧数据:
localStorage.clear() - 重新登录
- 检查 localStorage:
console.log('Token:', !!localStorage.getItem('leasToken')) - 刷新页面验证登录状态保持
🔍 控制台日志说明
HTTPS 环境(加密存储)
[Token缓存] ✅ 已保存到加密存储
[Token缓存] ✅ 从加密存储加载成功
HTTP 环境(自动降级)
[Token缓存] ⚠️ 加密存储失败,降级为明文存储
[Token缓存] ✅ 已保存到明文存储(降级模式)
[Token缓存] ✅ 从明文存储加载成功(降级模式)
🔒 安全说明
- HTTPS 环境: 自动使用 AES-GCM 加密,安全性高 ✅
- HTTP 环境: 降级为明文存储,建议尽快升级到 HTTPS ⚠️
- 生产环境: 强烈推荐使用 HTTPS 部署
✅ 向后兼容
- ✅ 完全向后兼容,无需数据迁移
- ✅ 自动识别旧的明文 token
- ✅ 支持自动升级到加密存储(如果环境支持)
修复时间: 2026-01-08 影响范围: 所有用户的登录和会话管理 紧急程度: 建议尽快部署测试