前端Token失效检测与自动登出机制详解

核心机制

1. storage 事件监听(跨标签页同步)

javascript

复制代码
window.addEventListener("storage", e => {
    "userToken" !== e.key || !yc(e.newValue) || yc(e.oldValue) || (
        // 检测到 token 被清空,触发登出
        oF.j.next({ method: "beUnauthenticated", args: { navigateToSignIn: true, isBanned: false } })
    )
});
  • yc 函数判断值是否为空/null/undefined:

    javascript

    复制代码
    let yc = e => {
        if (null === e || "" === e) return true;
        try { let t = JSON.parse(e); return null === t.value || void 0 === t.value || "" === t.value } catch { return false }
    };
  • newValue 为空而 oldValue 非空时,触发 beUnauthenticated,跳转到登录页。

2. API 响应拦截(服务端 token 失效)

在 HTTP 拦截器 onAfterResponse / onResponseError 中处理:

javascript

复制代码
if (m.includes(r)) {  // m = [v.V.MISSING_TOKEN, v.V.INVALID_TOKEN]
    d.onTokenInvalid();  // 触发 beUnauthenticated
}

当后端返回 MISSING_TOKENINVALID_TOKEN 错误码时,自动调用登出逻辑。

3. 主动清除 token

登出函数 hB 中:

javascript

复制代码
await (0, to.d9)(...);   // 调用登出 API
n({ navigateToSignIn: true, isBanned: false });  // 触发 beUnauthenticated

4. 统一跳转逻辑 beUnauthenticated

javascript

复制代码
function fi(e) {
    let { navigateToSignIn: t, isBanned: n } = e;
    w.y.setStorageUserToken(null);   // 清空本地 token
    // ... 清理其他状态 ...
    t && fo(n ? nE.BANNED : nE.SIGN_IN);  // 跳转到登录页或被封禁页
}

完整流程

触发场景 检测方式 动作
其他标签页登出 storage 事件 当前标签页调用 beUnauthenticated
后端返回 token 失效 API 响应拦截 调用 beUnauthenticated
用户主动点击登出 调用登出 API 清除 token 并跳转
手动清空 localStorage storage 事件(同一标签页不触发,但跨标签页会) 同上

这样确保了无论 token 如何被置空或失效,前端都能可靠地跳转到登录页面。

相关推荐
佛山个人技术开发24 分钟前
个人建站接单|汽车汽配行业宽屏自适应官网模板 工厂企业定制建站源码
前端·css·前端框架·html·汽车·php
光影少年34 分钟前
react的Context 和 Redux 区别?
前端·javascript·react.js·前端框架
前端 贾公子41 分钟前
uni-app工程化实战:基于vue-i18n和i18n-ally的国际化方案 (上)
前端·javascript·vue.js
喵个咪1 小时前
基于 Flutter 的 Headless CMS 全平台前端架构:技术解析与二次开发导引
前端·flutter·cms
vim怎么退出1 小时前
Dive into React——Diff 算法
前端·react.js·源码阅读
拾年2751 小时前
别调 BERT 了:我用 Prompt 做了套 NLP 系统,20 分钟搞定
前端·人工智能
半个落月2 小时前
别再死记变量提升了——从 V8 编译过程真正理解 JS 执行机制
前端
橘子星2 小时前
别再懵圈!JS 执行机制的 “千层套路” 全揭秘
前端·javascript
GuWenyue2 小时前
LeetCode 76 最小覆盖子串|JS 滑动窗口标准解法
前端·算法·面试
YHHLAI2 小时前
前端 HTTP 请求 & LLM 接口开发
前端·网络协议·http