请求时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 相关文章推荐
键盘 keycode的值 javascript时触发事件时很有用的要素
Nov 02 Javascript
extjs两个tbar问题探讨
Aug 08 Javascript
js判断iframe内的网页是否滚动到底部触发事件
Mar 18 Javascript
JavaScript中定义函数的三种方法
Mar 12 Javascript
JavaScript的兼容性与调试技巧
Nov 22 Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 Javascript
Node.js中 __dirname 的使用介绍
Jun 19 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
Oct 11 Javascript
vue2.0+koa2+mongodb实现注册登录
Apr 10 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
Nov 19 Javascript
nginx部署多个vue项目的方法示例
Sep 06 Javascript
JavaScript 防篡改对象的用法示例
Apr 24 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
python解析xml模块封装代码
2014/02/07 Python
Python解析nginx日志文件
2015/05/11 Python
解决Python传递中文参数的问题
2015/08/04 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
python实现聚类算法原理
2018/02/12 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
巴黎一票通:The Paris Pass
2018/02/10 全球购物
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
美国最大点评网站:Yelp
2018/02/14 全球购物
运动会广播稿50字
2014/01/26 职场文书
政风行风建设责任书
2014/07/23 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
资料员岗位职责
2015/02/10 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
解析目标检测之IoU
2021/06/26 Python
Ajax实现三级联动效果
2021/10/05 Javascript
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers