请求时token过期自动刷新token操作


Posted in Javascript onSeptember 11, 2020

1.在开发过程中,我们都会接触到token,token的作用是什么呢?主要的作用就是为了安全,用户登陆时,服务器会随机生成一个有时效性的token,用户的每一次请求都需要携带上token,证明其请求的合法性,服务器会验证token,只有通过验证才会返回请求结果。

2.当token失效时,现在的网站一般会做两种处理,一种是跳转到登陆页面让用户重新登陆获取新的token,另外一种就是当检测到请求失效时,网站自动去请求新的token,第二种方式在app保持登陆状态上面用得比较多。

3.下面进入主题,我们请求用的是axios,不管用何种请求方式,刷新token的原理都是一样的。

//封装了一个统一的请求函数,这个不是重点

export default function request(url, options) {
  const token = localStorage.getItem('token');
  const defaultOptions = {
    headers: {
      Authorization: `Bearer ${token}`,
    },
    withCredentials: true,
    url: url,
    baseURL: BASE_URL,
  };
  const newOptions = { ...options, ...defaultOptions };
  return axios.request(newOptions)
    .then(checkStatus)
    .catch(error => console.log(error));
}

// 封装了一个检测返回结果的函数,与后台返回状态码code === 1002表示token失效

let isRefreshing = true;
function checkStatus(response) {
 if (response && response.code === 1002) {
  // 刷新token的函数,这需要添加一个开关,防止重复请求
  if(isRefreshing){
    refreshTokenRequst()
  }
  isRefreshing = false;
  // 这个Promise函数很关键
   const retryOriginalRequest = new Promise((resolve) => {
        addSubscriber(()=> {
          resolve(request(url, options))
        })
      });
      return retryOriginalRequest;
 }else{
   return response;
 }
}

// 刷新token的请求函数

function refreshTokenRequst(){
  let data;
  const refreshToken = localStorage.getItem('refreshToken');
  data:{
    authorization: 'YXBwYXBpczpaSWxhQUVJdsferTeweERmR1praHk=',
    refreshToken,
  }
  axios.request({
    baseURL: BASE_URL,
    url:'/app/renewal',
    method: 'POST',
    data,
  }).then((response)=>{
    localStorage.setItem('refreshToken',response.data.refreshToken);
    localStorage.setItem('token',response.data.token);
    onAccessTokenFetched();
    isRefreshing = true;
  });
}

// Promise函数集合

let subscribers = [];
function onAccessTokenFetched() {
  subscribers.forEach((callback)=>{
    callback();
  })
  subscribers = [];
}

function addSubscriber(callback) {
  subscribers.push(callback)
}

总结:

其实token失效,自动刷新token,在页面只有一个请求的时候是比较好处理的,但是如果页面同时有多个请求,并且都会产生token失效,这就需要一些稍微复杂的处理,解决方式主要是用了Promise 函数来进行处理。

每一个token失效的请求都会存到一个Promise函数集合里面,当刷新token的函数执行完毕后,才会批量执行这些Promise函数,返回请求结果。

还有一点要注意一下,这儿设置一个刷新token的开关isRefreshing,这个是非常有必要的,防止重复请求。

以上这篇请求时token过期自动刷新token操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
Jul 10 Javascript
动态创建样式表在各浏览器中的差异测试代码
Sep 13 Javascript
js如何取消事件冒泡
Sep 23 Javascript
Jquery getJSON方法详细分析
Dec 26 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
js中如何完美的解析数据
Mar 18 Javascript
jQuery实现的隔行变色功能【案例】
Feb 18 jQuery
怎样使你的 JavaScript 代码简单易读(推荐)
Apr 16 Javascript
JS如何判断对象是否包含某个属性
Aug 29 Javascript
基于ajax实现上传图片代码示例解析
Dec 03 Javascript
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
vue+axios 拦截器实现统一token的案例
Sep 11 #Javascript
Vue axios获取token临时令牌封装案例
Sep 11 #Javascript
Vue-cli4 配置 element-ui 按需引入操作
Sep 11 #Javascript
vue 子组件和父组件传值的示例
Sep 11 #Javascript
jQuery实现朋友圈查看图片
Sep 11 #jQuery
详解webpack的文件监听实现(热更新)
Sep 11 #Javascript
js代码编写无缝轮播图
Sep 13 #Javascript
You might like
用PHP的ob_start();控制您的浏览器cache!
2007/02/14 PHP
php下通过伪造http头破解防盗链的代码
2010/07/03 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
javascript引用对象的方法
2007/01/11 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
Python随机生成彩票号码的方法
2015/03/05 Python
Python随机数random模块使用指南
2016/09/09 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python中常用信号signal类型实例
2018/01/25 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
J2EE中的容器都包括哪些
2013/08/21 面试题
幼儿园儿童节主持词
2014/03/21 职场文书
家长对孩子的评语
2014/04/18 职场文书
学校花圃的标语
2014/06/18 职场文书
设计专业自荐信
2014/06/19 职场文书
会议通知
2015/04/15 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL