请求时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中prop()方法和attr()方法的区别浅析
Sep 06 Javascript
IE6下拉框图层问题探讨及解决
Jan 03 Javascript
详解Vue源码学习之callHook钩子函数
Jul 25 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
Jul 25 Javascript
详解redux异步操作实践
Aug 15 Javascript
vue.js实现的幻灯片功能示例
Jan 18 Javascript
微信小程序生成分享海报方法(附带二维码生成)
Mar 29 Javascript
layui表格设计以及数据初始化详解
Oct 26 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
Nov 26 jQuery
浅谈vue中$event理解和框架中在包含默认值外传参
Aug 07 Javascript
TypeScript魔法堂之枚举的超实用手册
Oct 29 Javascript
JavaScript实现切换多张图片
Jan 27 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
杏林同学录(六)
2006/10/09 PHP
PHPMyAdmin 快速配置方法
2009/05/11 PHP
php查询whois信息的方法
2015/06/08 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
stripos函数知识点实例分享
2019/02/11 PHP
JavaScript的目的分析
2007/01/05 Javascript
Javascript 继承实现例子
2009/08/12 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
RequireJs的使用详解
2017/02/19 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
2017/06/20 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
Cython 三分钟入门教程
2009/09/17 Python
深入学习Python中的装饰器使用
2016/06/20 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
python设置环境变量的原因和方法
2019/06/24 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
python英语单词测试小程序代码实例
2019/09/09 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
总经理司机职责
2014/02/02 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
大学生新学期计划书
2014/04/28 职场文书
企业宣传标语
2014/06/09 职场文书
机电一体化专业求职信
2014/07/22 职场文书
2015年大学生实习评语
2015/03/25 职场文书