请求时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 相关文章推荐
JS的IE和Firefox兼容性集锦
Dec 11 Javascript
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
Apr 12 Javascript
jQuery 使用手册(六)
Sep 23 Javascript
JSON传递bool类型数据的处理方式介绍
Sep 18 Javascript
Javascript之this关键字深入解析
Nov 12 Javascript
JavaScript异步回调的Promise模式封装实例
Jun 07 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
Jun 01 Javascript
javascript显示中文日期的方法
Jun 18 Javascript
JS实现的另类手风琴效果网页内容切换代码
Sep 08 Javascript
Node.js中的http请求客户端示例(request client)
May 04 Javascript
Vue中函数防抖节流的理解及应用实现
Apr 24 Javascript
Javascript查看大图功能代码实现
May 07 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模板技术原理【一】
2008/01/10 PHP
PHP生成器简单实例
2015/05/13 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
JSON取值前判断
2014/12/23 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
Python使用filetype精确判断文件类型
2017/07/02 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
道德之星事迹材料
2014/05/03 职场文书
cf战队收人口号
2014/06/21 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
Mysql如何查看是否使用到索引
2022/12/24 MySQL