Vue 无感刷新token

news2024/11/20 20:24:18

关于无感刷新的理解: 
实现token无感刷新对于前端来说是一项非常常用的技术,其本质是为了优化用户体验,当token过期时不需要用户跳回登录页重新登录,而是当token失效时,进行拦截,发送刷新token的请求,获取最新的token进行覆盖,让用户感受不到token已经过期


刷新token的一些方案

  • 方案一:后端返回过期时间,前端判断token过期时间,去调用刷新token接口
    缺点:需要后端额外提供一个Token过期时间的字段;使用了本地时间判断,若本地时间被篡改,特别是本地时间比服务器时间慢时,拦截会失败。
  • 方案二:写个定时器,定时刷新Token接口
    缺点:浪费资源,消耗性能,不建议采用。
  • 方案三:在响应拦截器中拦截,判断Token 返回过期后,调用刷新token接口

有三种方案,这里我们采用第三种方案解决

思路:

模拟操作:
 1. 手动修改本地储存里的那个token(改错 模拟过期)
 2. 触发需要标明身份的接口(错误token携带给后台操作)
 3. 请求返回状态为401 ,进入错误响应拦截器

 代码解决401问题
 有感刷新:
 清除token ,强制跳转回登陆页面,有感知的重新登陆拿到新token替换到本地
 需要重新触发接口,感觉特别不好

 无感刷新操作以及流程:
 刷新token,使用登陆时候保存的refresh_token,调用另外一个接口,换回来
 新的token值 ,替换到本地,再次完成本次未完成的请求(用户无感知)
 1.登陆页面 localStorage.setItem('refresh_token', res.data.data.refresh_token 存入 
 refresh_token
 2.在响应拦截器中对401状态码引入刷新token的api方法调用
 3.替换保存本地新的token
 4.error错误对象里headers替换成新的token
 5.axios再次发起这次未完成的请求,返回promise对象到最开始发请求的逻辑页面
 6.如果refresh_token也过期了,那么就判断是否过期,过期了就清除localStorage所有值跳转回登陆页面

简易代码:

首先跟后端大哥沟通,让他在登陆接口中给我们返回正常的token和刷新的token,然后我们都存起来,然后让后端大哥写一个刷新token的接口

登陆时拿到的后端数据:

 

把登陆时拿到的后端数据存起来

  然后再响应拦截器中判断状态码为401,代表身份过期,在这里进行无感刷新token



// 添加响应拦截器  本质:就是一个函数
axios.interceptors.response.use(function (response) {
  // http响应状态码为2xxx 3xxx就进入这里
  // 对响应数据做些什么
  return response
}, async function (error) {
  // http 响应状态码为4xx 5xx就会进入这里
  console.log('error', error)
  if (error.response.status === 401) { // 状态码为401 身份过期
    

    removeToken()// 清除token,才能让路由守卫判断
   
    // 使用refresh_token 换回新的token再继续使用 用户无感知
    //请求后端给的刷新token的接口
    const res = await refreshTokenAPI()

    // 1.拿到新的token更新token到本地
  localStorage.setItem('token', res.data.data.token)
    
    
    // error.config 就是上一次axios请求的配置对象
    // console.dir(error.config)
    // 2. 把新的token赋予到下一次axios请求的请求头中

    error.config.headers.Authorization = 'Bearer ' + res.data.data.token

    // 3.未完成这次请求,再一次发起请求
    // 结果我们要return回原本逻辑调用地方 返回一个promise对象

    return axios(error.config)
    // 如果刷新的refresh_token也过期了
    // 判断refresh_token的请求的状态,路径,请求方式
  } else if (error.response.status === 500 && error.config.url === 'refresh_token请求的路径' && error.config.method === 'put') {
  //  清除localStorage所有值
    localStorage.clear()
    // 跳到登陆页
    router.replace('/login')
  }
  return Promise.reject(error)
})

 以上是个人对开发中使用Token的一点总结,如有叙述不当之处请指正,我将及时改正并感谢!
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础JavaScript学习【第六期】

博主有话说:这个礼拜有些忙,离上一次更新已经过了亿天,这几天较忙所以更新会有点慢,谢谢大家的支持。(っ•̀ω•́)っ✎⁾⁾ 我爱学习 个人空间:GUIDM的个人空间 专栏内容:零基础JavaScript学习 基础还是关键。 欢迎大家的一键三连。 前情回顾:第一期https://blog.cs…

uni-app - 最详细 H5 网页接入微信支付功能,提供从详细的示例代码与注释(移动端网页实现微信支付能力,微信公众号前端支付 JSAPI / JS-SDK 详细示例源码)官方最新超级详细教程

前言 关于 uni-app 项目中接入微信支付的文章鱼龙混杂,各种 JSAPI / JS-SDK 乱代码、过时、没注释、不讲流程原理,非常难用。 本文实现了 uni-app H5 移动端网页项目,实现微信支付功能,详细讲解接入流程及超详细示例代码, 从 0-1 完全站在小白的角度,让您无需太多知识也…

【React】React入门--生命周期

🎀个人主页:努力学习前端知识的小羊 感谢你们的支持:收藏🎄 点赞🍬 加关注🪐 文章目录React生命周期初始化阶段运行中阶段销毁阶段老生命周期的问题新生命周期代替性能优化的方案重要的勾子即将废弃的勾子R…

【ElementUI样式优化1】el-table 修改斑马格样式、修改滚动条样式、添加表头边框、删除表格边框划线

重要的不是过去,而是你怎末看待过去,而我们对过去的看法,是可以改变的。 效果预览: (1)删除表格外框,内框。 (2)添加表头边框,修改表头文字大小、颜色 &…

猿创征文 |【高级篇】Java 进阶之JVM实战

文章目录⚡前言一、面试题解析二、JVM 理论详解⛅JVM的位置❄️JVM的体系结构⏳类加载器三、JVM 双亲委派机制四、Native 关键字五、PC寄存器 与 方法区六、栈与堆七、三种JVM、新生区、老年区、永久区⛵小结⚡前言 JVM 是 Java 实现 跨平台的基础,所有的Java 程序…

[遇到的问题-已解决]Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.1

如上图所示,这是我解决好的,刚开始的时候爆红有这些: 我按照在网上查找的方法,一一试了。 首先,maven 安装的路径和和本地仓库的目录必须要保持一致 打开setting-Build,Excution,Deployment-Build Tools-Maven&#…

vue框架介绍

概述 Vue 是一套用于构建用户界面的渐进式框架 对渐进式的理解: 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求有强有弱,它的强势程度会影响在业务开发中的使用方式。 vue的定位: 我在做…

【Vue入门必备知识篇03】--- 生命周期 数据共享

前言❤️ 过好自律的生活,美好才会在路上不期而遇 ❤️【Vue入门必备知识篇03】--- 生命周期 & 数据共享一、生命周期 & 数据共享(1)组件的生命周期1.1 生命周期 & 生命周期函数1.2 组件生命周期函数的分类1.3 生命周期图示&…

记录Chrome插件从V2版本升级到V3版本的过程中遇到的问题

总结一下自己在把Chrome V2版本的插件升级到V3版本的过程中,遇到的一些问题,之前也有发布一章V3版本的manifest.json配置项参数说明,基本也涵盖了下面提到的几个配置项的改动,传送门>> 总结分了两大块,一块是ma…

【Node.js】深度解析常用核心模块-fs模块

✅ 作者简介:一名将要迈入大三的大学生,致力于提高前端开发能力 ✨ 个人主页:前端小白在前进的主页 🔥 系列专栏 : node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 🔥前言 在文章👉Node.js — 前…

React脚手架工具创建项目的详细介绍

文章目录React脚手架工具脚手架工具解析create-react-app创建React项目目录的结构分析从零编写代码React脚手架工具 脚手架工具解析 如果我们只是开发几个小的demo程序,那么永远不需要考虑一些复杂的问题: 比如目录结构如何组织划分; 比如如何管理文件之间的相互依…

Python lxml库的安装和使用

lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 Xpath 表达式提供了良好的支持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 安装lxml库 lxml 属于 Python 第三方库,因此需要…

全网多种方式解决Unchecked runtime.lastError: The message port closed before a response was received的错误

文章目录1. 文章引言2. 分析问题3. 解决问题4. 解决该错误的其他方法1. 文章引言 今天启动项目后访问Knife4j接口文档,却报出下图错误: 在报出Knife4j文档请求异常错误时,赶紧打开控制台,如下所示: 即Unchecked runti…

CSS过渡动画

css中实现动画有两种方式:transition过渡动画、 animation自定义动画。 transition 是 css3 新增的⼀个功能,可以实现元素不同状态间的平滑过渡(当元素从⼀个状态进⼊到另⼀个状态时),经常⽤来制作⼀些动画效果。 之…

前端项目面试核心问题(持续更新)

本文有配套视频教程 项目面核心问题回答思路 说说你最近的项目 记叙文的六要素:时间、人物、地点、起因、经过、结果;时间:研发周期;人物:团队成员、分工、我负责哪几个模块;起因:项目背景、…

Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(开发导航栏及公共部分)

基于 Vue3.x Vant UI 的多功能记账本(三) 文章目录基于 Vue3.x Vant UI 的多功能记账本(三)项目演示开发导航栏1、底部导航栏2、测试底部导航栏3、公共头部写到最后(附源码)系列内容参考链接基于 Vue3.x …

element-UI组件之日期时间选择器与时间格式转化

element-UI组件之日期时间选择器与时间格式转化日期选择器与时间选择器的一般使用日期时间选择器选择日期时间点选择日期范围日期选择器月份范围选择器禁选日期用time.getTime()进行日期(时间)格式的转换时间选择器el-time-select选择固定时间点el-time-picker选择任意时间点禁…

Vite 基本配置及原理

Vite 基本配置及原理介绍vite.config.jsoptimizeDeps.exclude不同环境的 vite 配置css配置Vite 对 css 的处理Vite 对 cssmodule 的处理和配置Vite 对预处理器的配置devSourcemapVite 对 postcss 的支持Vite 静态资源别名设置Vite 生产环境配置介绍 如果你还不知道 Vite&#…

【Vue入门必备知识篇05】--- Vue Router路由

前言❤️ 当落日余晖照在身上,没有污秽没有杂尘,只有光和希望 ❤️【Vue入门必备知识篇05】--- Vue Router路由一、前端路由的概念与原理(1)什么是路由(2)SPA 与前端路由(3)什么是前…

vue-router中的参数传递

文章目录前言一、本文章中练习需要的准备工作暴力引入bootstrap安装Vue Router二、项目基本架构1. 配置router文件2. 写入路由组件 一级路由3. 二级路由 实现传参3.1 使用params 传参3.1.1 在router文件下配置二级路由3.1.2 在view文件下新建二级路由组件3.1.3 在上一级路由组件…