当前位置: 首页 > news >正文

前端 Vue 项目怎么拦截 401 错误并自动无感刷新 JWT 令牌?

在 Vue 3 结合 Axios 1.6.0 的项目中,通过响应拦截器判断 error.response.status === 401 可触发令牌刷新,典型实现能将用户无感知的中断时间控制在 200ms 以内。

原因分析

HTTP 状态码 401 Unauthorized 定义于 RFC 7235 第 3.1 节,表示请求缺乏有效的身份验证凭证。在 JWT 机制中,Access Token 通常设定较短有效期(如 2 小时),过期后服务端返回 401。若前端未拦截处理,用户会直接被踢出登录态。根据 Axios 官方文档,响应拦截器是处理此类全局错误的标准入口,错误对象结构固定为 error.response.status。

解决方案

1. 配置 Axios 响应拦截器

在 src/utils/request.js 中注册拦截器,监听 status 是否为 401。参考 Axios 1.6.0 版本 API,代码示例如下:

service.interceptors.response.use(response => { return response }, error => { if (error.response && error.response.status === 401) { handleUnauthorized() } return Promise.reject(error) })

2. 实现无感刷新逻辑

核心是防止并发请求重复刷新。需维护一个 isRefreshing 标志位和一个 requestQueue 队列。当第一个 401 触发刷新时,isRefreshing 设为 true,后续请求存入队列。刷新成功后(通常耗时 100-300ms),遍历队列重试。若刷新失败(如 Refresh Token 也过期),则状态码仍为 401,此时应清除本地存储并跳转登录页。

3. 路由守卫配合

使用 Vue Router 4.2.5 的 beforeEach 守卫,在跳转前检查 Token 有效性。若拦截到 401 且刷新失败,调用 router.replace('/login') 强制重新认证,避免死循环。

注意事项

1. 无限刷新循环:若刷新接口本身返回 401,必须标记不再尝试刷新,否则会导致浏览器卡死。社区反馈常见错误是未在 refresh 请求中排除拦截逻辑。

2. 并发请求丢失:未使用队列机制时,5 个并发请求同时 401 会触发 5 次刷新接口,导致服务端报错 429 Too Many Requests。

3. 存储安全:JWT 建议存储在 httpOnly Cookie 中而非 localStorage,防止 XSS 攻击窃取令牌,这是 OWASP 建议的安全实践。

参考来源

来源:Axios GitHub - Interceptors 官方文档说明

来源:MDN Web Docs - HTTP Status 401 定义

来源:Vue Router Docs - Navigation Guards 使用指南

原文链接:https://www.zjcp.cc/ask/9635.html

http://www.jsqmd.com/news/753866/

相关文章:

  • 不止于解锁:深入理解GD32F303的读保护机制与安全配置实战
  • 手把手教你用Vant组件库+动态计算,搞定微信小程序自定义导航栏与Tabbar高度(附完整代码)
  • 如何5分钟搭建便携式API测试环境:Postman便携版终极指南 [特殊字符]
  • 机器学习面试超详细实战指南(2026版)——不懂高数也能看懂的硬核干货,建议从头看到尾
  • 免费快速转换QQ音乐加密格式的macOS终极教程
  • MASA模组汉化解决方案:为中文玩家构建无障碍游戏体验
  • 镜像孪生空间智能技术,破解粮库无感定位多重难题
  • 从开发者视角浅谈 Taotoken 官方折扣活动对项目预算的积极影响
  • Windows系统优化终极指南:5分钟掌握WinUtil高效管理技巧
  • 别再死记硬背了!用Python的NumPy库5分钟搞定矩阵特征值与特征向量计算
  • 扩散模型采样加速与LoRA微调优化实践
  • 使用Nodejs快速接入Taotoken并实现异步聊天补全调用
  • 华为防火墙实战:从零配置Trust、Untrust、DMZ三区域互通(附完整命令与避坑点)
  • 高效实用的网站离线下载工具:WebSite-Downloader全面指南
  • 飞腾ARM服务器离线部署指南:用Nginx在银河麒麟V10 SP2上搭建私有Yum源
  • Python 3.6/3.7虚拟环境创建卡在ensurepip?一份针对老版本Python的venv避坑指南
  • 别再手动调格式了!用natbib包5分钟搞定LaTeX参考文献(数字/作者-年份)
  • 2026年4月沧州316人孔实力厂商盘点:为何恒阜管道备受推崇? - 2026年企业推荐榜
  • 别再死记硬背公式了!用Python手写一个感知机,从鸢尾花分类理解机器学习的‘第一课’
  • AI编程助手令牌优化:lean-ctx上下文压缩引擎实战指南
  • 智能座舱“卡顿”是谁的锅?一次性能与兼容性测试实战复盘(含工具链)
  • Windows驱动存储清理终极指南:Driver Store Explorer完全使用教程
  • 从Vim叛逃到Nano:一个运维老兵的服务器文本编辑实战心得
  • 从买菜做饭到大模型:一份真正看懂深度学习的硬核指南
  • Go 文件与 I/O 操作完全指南
  • GX_EXT编译问题 - SD
  • 深度硬核!2026年NLP面试最全指南:从Word2Vec到Transformer,大模型时代算法工程师通关秘籍
  • PHP 8.9扩展安全配置全失效?用这11行ini_set()禁用+8行opcache.preload校验代码重建可信执行边界
  • 译文: Microscope Illumination - 显微镜照明
  • 把 GPT-4o 按在地上摩擦?DeepSeek V4 深度测评来了