前端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_TOKEN 或 INVALID_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 如何被置空或失效,前端都能可靠地跳转到登录页面。

相关推荐
涛涛ing3 小时前
Chrome DevTools MCP 正式可用:AI 终于能自己开浏览器调试你的页面了
前端
after you3 小时前
【无标题】
前端·javascript
酷炫码神3 小时前
Day 6|ES6+ 语法:把现代 JS 写顺手,从解构到 map / filter / reduce
前端·javascript·es6
lemon_sjdk3 小时前
从一段真实的 Electron IM 前端代码,看高级前端的工程化修养
前端·electron·状态模式·im
IT_陈寒4 小时前
Vite性能优化完全指南
前端·人工智能·后端
燕落南枝4 小时前
HTML 表单入门:表单容器、文本框与密码框属性详解
前端·microsoft·html
TYC94 小时前
Mac创建Vue3+TypeScript或者React+TypeScript项目
前端·javascript·typescript
程序员小孔.4 小时前
基于 SpringBoot + UniApp + Vue 的家政服务系统设计与实现
前端·数据库·spring boot·python·docker·微信小程序
Profile排查笔记4 小时前
指纹浏览器 GitHub 项目怎么选?先看仓库交付的是工具、内核还是管理器
前端·人工智能·后端·自动化
风骏时光牛马4 小时前
云原生驱动的分布式高可用架构设计与落地实践
前端