请求时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兼容火狐显示上传图片预览效果的方法
May 21 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
Nov 04 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
Nov 27 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
Dec 19 Javascript
js微信扫描二维码登录网站技术原理
Dec 01 Javascript
微信小程序 MD5加密登录密码详解及实例代码
Jan 12 Javascript
代码分析vue中如何配置less
Sep 28 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
微信小程序实现联动选择器
Feb 15 Javascript
微信小程序学习笔记之函数定义、页面渲染图文详解
Mar 28 Javascript
关于AOP在JS中的实现与应用详解
May 06 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
May 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
长波知识介绍
2021/03/01 无线电
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
python selenium firefox使用详解
2019/02/26 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
python3字符串输出常见面试题总结
2020/12/01 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
媒体宣传策划方案
2014/05/25 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
老龙头导游词
2015/02/11 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
创业计划书之水果店
2019/07/18 职场文书
Python基础详解之邮件处理
2021/04/28 Python