请求时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文件的三种方法
Nov 08 Javascript
jquery实现html页面 div 假分页有原理有代码
Sep 06 Javascript
Javascript学习指南
Dec 01 Javascript
jQuery实现表格展开与折叠的方法
May 04 Javascript
jquery ajax分页插件的简单实现
Jan 27 Javascript
深入浅出 jQuery中的事件机制
Aug 23 Javascript
基于jQuery实现简单人工智能聊天室
Feb 10 Javascript
Angular实现跨域(搜索框的下拉列表)
Feb 16 Javascript
JS仿JQuery选择器功能
Mar 08 Javascript
详解ajax的data参数错误导致页面崩溃
Apr 30 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 Javascript
Vue基础配置讲解
Nov 29 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
JS中encodeURIComponent函数用php解码的代码
2012/03/01 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
JavaScript定时器详解及实例
2013/08/01 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
Fabric 应用案例
2016/08/28 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
python isinstance函数用法详解
2020/02/13 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
大学新生军训个人的自我评价
2013/10/03 职场文书
小学国庆节活动方案
2014/02/11 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
安全责任书怎么写
2014/07/28 职场文书
普宁寺导游词
2015/02/04 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
python用tkinter开发的扫雷游戏
2021/06/01 Python
Win11更新失败并提示0xc1900101
2022/04/19 数码科技
Android实现图片九宫格
2022/06/28 Java/Android