管理后台操作中自动退出:第二轮修复(2026-10-16)
用户再次确认:正在操作时突然回到登录页。未取得该次失败请求的网络记录,因此以下是已复现的代码缺陷,不将其直接等同于用户当次退出的唯一原因。
现场与复现
- 正式站
https://admin.xiaoshu.pro 版本为 3bf81740cc1ceca68b74da52bb8ba7baddc61fa7。实际下载的 JavaScript 包含上次添加的会话复核,同时仍包含普通 HTTP 401 清除登录、直接使用 storage 事件旧值的逻辑。
- 使用现有配置的运营会话只读请求 Parse
/sessions/me,HTTP 200;创建时间 2026-09-09,到期时间 2027-09-09。只证明这条抽查会话有效,不代表受影响用户会话均有效。
- 新增回归用例,在修改实现前运行:17 项中 5 项失败。复现了普通 401 误退出、非用户结构的成功响应误退出、旧请求清除另一标签页的新登录、排队的旧退出事件覆盖新登录,以及迟到的身份响应将旧登录写回共享存储。
修复
- Parse 复核只有 HTTP 400/401 且明确返回错误码 209 才判定 token 失效。单独的 HTTP 401、网络故障、异常响应结构保留登录,业务请求仍返回错误且不会自动重复写操作。
- 读取到真实用户对象后仍核对账号一致性、停用和删除状态;有效的安全退出行为保留。
- storage 通知到达时读取当前共享状态,避免重放排队中的旧登录/退出值;检查失败和清除会话之前同样核对共享状态。
- 身份信息落盘前同步共享登录,避免迟到响应覆盖其他标签页的新登录。
- 本地持久存储写入失败时保持标签页内会话可用,不因共享存储为空强迫退出。
验证
- ChromeHeadless 定向回归 36 项通过:会话服务、云请求、登录页、路由缓存、实时刷新。
npm run build:admin 通过;仅已有样式预算和 CommonJS 警告。
git diff --check 通过。
- 发布结果另行追加;本节不将本地验证等同于正式部署,也不声称已完成受影响用户环境的持续使用验收。
正式发布结果
- 修复提交
3a19e40081d88221dbf218d31dfc8f7d437cc2da 已推送;发布版本 3a19e40081d8-20261016T022415035Z。
- 发布前备份正式 OBS 桶的 425 个对象,共 23,427,646 字节;源站入口与公网旧入口一致。受保护的本机备份与上传记录位于
~/.local/state/xiaoshu/cloud-releases/2026-10-16-admin-session/。
- 使用已验证的生产构建,先上传资源并逐个核对源站哈希,再更新版本清单和入口;切换前再次核对旧入口没有被其他发布改变。保留全部旧哈希文件。
- CDN 刷新任务
7897307878:task_done,成功 1、失败 0。
- 公网版本、95 个文件 SHA-256、发布脚本中的深层路由全部校验通过。不带查询参数的
/、/admin/login、/admin/dashboard、/admin/store-home、/admin/schedule 均返回 HTTP 200 和新入口。
- 额外只读探测:人为构造的无效 token 调用正式
/parse/users/me 返回 HTTP 400、错误码 209,符合修复后的真实失效识别条件。
- 本次未修改云函数、数据库或服务端会话期限;未主动注销现有用户会话。已打开的旧页面需刷新以加载新脚本。
- 用户现场的持续操作验收尚未完成;未取得当次退出日志,不能据此声称所有频繁退出原因均已排除。