请求时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 相关文章推荐
prototype Element学习笔记(篇一)
Oct 26 Javascript
Pro JavaScript Techniques学习笔记
Dec 28 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
Feb 07 Javascript
原生javascript实现图片滚动、延时加载功能
Jan 12 Javascript
浅谈Javascript数组(推荐)
May 17 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 Javascript
vue-cli3 从搭建到优化的详细步骤
Jan 20 Javascript
全面了解JavaScript的作用域链
Apr 03 Javascript
详解Vue源码中一些util函数
Apr 24 Javascript
微信小程序实现分享商品海报功能
Sep 30 Javascript
Node.js控制台彩色输出的方法与原理实例详解
Dec 01 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生成zip压缩文件的方法详解
2013/06/09 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
jQuery 加上最后自己的验证
2009/11/04 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
Python open读写文件实现脚本
2008/09/06 Python
python条件和循环的使用方法
2013/11/01 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
python模块如何查看
2020/06/16 Python
常用的HTML5列表标签
2017/06/20 HTML / CSS
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
阿里旅行:飞猪
2017/01/05 全球购物
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
银行实习人员自我鉴定
2013/09/22 职场文书
大学生预备党员自我评价分享
2013/11/16 职场文书
招商经理岗位职责
2013/11/16 职场文书
初中同学聚会感言
2014/02/11 职场文书
化工操作工岗位职责
2014/04/29 职场文书
安全生产宣传标语
2014/06/06 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
Oracle用户管理及赋权
2022/04/24 Oracle