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

相关推荐
疯华整猫2 小时前
被杀掉之后:我把 Android 的「唤起 + 常驻」重做了一遍
前端·面试·架构
IT_陈寒4 小时前
Java开发实战:从入门到精通
前端·人工智能·后端
风骏时光牛马4 小时前
生成一个AI转岗经历标题,只需要一个标题,不需要其他的任何文本。
前端
Csvn14 小时前
Monorepo
前端
Csvn14 小时前
流水线
前端
Csvn14 小时前
微前端架构
前端
Linux-lucky15 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
风骏时光牛马18 小时前
生成一个移动端标题,只需要一个标题,不需要其他的任何文本。
前端
IT_陈寒18 小时前
Redis雪崩把我坑惨了,这是5年经验的教训
前端·人工智能·后端
SameX18 小时前
HarmonyOS ArkUI List 的侧滑删除 用 ListItem 的 swipeAction + endIcon 的做法
前端