路由守卫不直接判断超时,需结合时间状态管理和守卫拦截:1. 全局监听交互事件刷新localStorage中lastActive时间戳;2. checkSessionTimeout()函数计算并返回超时布尔值;3. router.beforeEach中调用该函数,超时则清token并跳转登录页;另配定时器每60秒兜底检测。

路由守卫本身不直接判断“页面访问超时”,它只在路由跳转节点执行校验。真正实现“超时自动退出”,需要把**时间状态管理**和**守卫拦截逻辑**结合起来——前者负责记录/更新/检测用户活跃时间,后者负责在关键跳转点强制拦截并跳转。
核心思路:活跃时间 + 守卫拦截
用户登录后,系统需持续跟踪其“最后活跃时间”。这个时间不是静态的登录时间,而是随点击、滚动、键盘输入等操作动态刷新的。一旦检测到当前时间与最后活跃时间差超过阈值(如15分钟),就视为超时。但检测动作不能只靠定时器轮询,必须配合路由守卫,在每次跳转前做最终确认,避免用户绕过检测直接访问受保护页面。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
具体实现三步走
1. 全局记录与刷新活跃时间
在 App 根组件(如 App.vue)或入口文件中监听全局事件,实时更新 localStorage 中的 lastActive 时间戳:
- 监听
@click、@mousemove、@keydown等用户交互事件 - 每次触发时,执行
localStorage.setItem('lastActive', Date.now().toString()) - 可封装为一个
keepAlive()工具函数,统一调用
2. 设置超时检测逻辑
单独写一个工具函数(如 checkSessionTimeout()),用于判断是否已超时:
- 读取
localStorage.getItem('lastActive') - 计算
Date.now() - parseInt(lastActive) - 若差值 > 设定阈值(如
15 * 60 * 1000),返回true - 该函数不主动跳转,只提供布尔结果,保持职责单一
3. 在路由守卫中执行拦截
使用 router.beforeEach 全局前置守卫,在每次跳转前调用检测逻辑:
- 若检测超时,清除登录态(
localStorage.removeItem('token')等) - 用
next({ path: '/login', query: { redirect: to.fullPath } })跳转至登录页 - 注意:即使用户手动输入 URL 访问 /dashboard,守卫也会拦截并重定向
- 对登录页、404 等免检路由,可通过
to.meta.ignoreAuth = true跳过校验
补充:防绕过的关键细节
仅靠守卫还不够——如果用户一直停留在某个页面不动,从不跳转,守卫就不会触发。因此必须搭配前端定时器兜底:
- 在登录成功后启动一个
setInterval(例如每 60 秒检查一次) - 检查时若发现超时,立即清除 token 并
window.location.replace('/login') - 这个定时器应在用户离开页面(
beforeunload)或登出时清除,避免内存泄漏 - 注意:不要用
setTimeout单次延时,它无法应对用户中途产生新操作的情况
守卫是防线,活跃时间是标尺,定时器是哨兵——三者协同,才能让超时退出既可靠又无感。


















