请求时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 相关文章推荐
列表内容的选择
Jun 30 Javascript
JavaScript的变量作用域深入理解
Oct 25 Javascript
基于jquery的可多选的下拉列表框
Jul 20 Javascript
TypeScript具有的几个不同特质
Apr 07 Javascript
jquery悬浮提示框完整实例
Jan 13 Javascript
JavaScript Math 对象常用方法总结
Apr 28 Javascript
jQuery向webApi提交post json数据
Jan 16 Javascript
jQuery获取table表中的td标签(实例讲解)
Jul 28 jQuery
Vue基于NUXT的SSR详解
Oct 24 Javascript
Vue2.0设置全局样式(less/sass和css)
Nov 18 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
May 08 Javascript
微信小程序顶部导航栏滑动tab效果
Jan 28 Javascript
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得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
php加密解密字符串示例
2016/10/13 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
javascript操作符"!~"详解
2015/02/10 Javascript
node.js实现快速截图
2016/08/27 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
adidas泰国官网:adidas TH
2020/07/11 全球购物
Java中compareTo和compare的区别
2016/04/12 面试题
Linux机考试题
2015/07/17 面试题
导游词300字
2015/02/13 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
小学英语听课心得体会
2016/01/14 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
Pillow图像处理库安装及使用
2022/04/12 Python