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