使用refresh_token实现无感刷新页面


Posted in Javascript onApril 26, 2022

步骤如下:

1-token过期根据refresh_token获取新的token 重新获取数据

2-创建一个新的axios实例 【使用request防止再次进入请求拦截和请求响应而进入死循环】

3-根据请求相应的响应值 是不是401 是:说明token过期

然后进行判断store中的 user :{token:'*',refresh_token:'**'}中的 refresh_token和user对象是否存在 ,如果不存在说明之前没有登录过,直接去登录

4-使用新创建的axios 实例对象 requestFreshToken 发送新的请求 headers中的口令携带的是 refresh_token

5-获取token之后 将值重新赋值给user中的token

6-将user重新存入store中

7-重新获取刚才因为token失效而没有获取的数据 直接使用request 参数 来自error对象中【这里保存了之前token失效的请求数据】

具体实现

代码如下:

import axios from "axios";

import store from "@/store";
import router from "@/router";

import jsonBig from "json-bigint";

import { Toast } from "vant";

// var json = '{ "value" : 9223372036854775807, "v2": 123 }'
// // console.log(JSON.parse(json),777888);
// console.log(jsonBig.parse(json).value.toString(),88888);

const request = axios.create({
  //  所有相应的数据就不会存在大数字问题了
  transformResponse: [
    function(data) {
      try {
        // 如果转换成功则返回转换的数据结果
        return jsonBig.parse(data);
      } catch (err) {
        // 如果转换失败,则包装为统一数据格式并返回
        return {
          data
        };
      }
    }
  ]

  //baseURL: "http://toutiao-app.itheima.net"
});

//  创建一个新的axios实例对象  这样做的目的就是 不会进入之前的请求拦截和响应 防止进入死循环
const requestFreshToken = axios.create();

// 添加请求拦截器
request.interceptors.request.use(
  function(config) {
    // 在发送请求之前做些什么
    //console.log(config, 9999);
    // if (window.localStorage.getItem('SET_TOKEN')) {
    //     config.headers.Authorization = 'Bearer ' + JSON.parse(window.localStorage.getItem('SET_TOKEN')).token
    // }

    if (store.state.user) {
      config.headers.Authorization = "Bearer " + store.state.user.token;
    }
    return config;
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
request.interceptors.response.use(
  function(response) {
    console.log(response, 3);

    return response;
  },
  async function(error) {
    console.log(error.response, 222);
    // 对响应错误做点什么
    // 对响应数据做点什么
    const status = error.response.status;
    if (status == 400) {
      //  请求参数错误
      Toast.file("请求参数错误");
    } else if (status == 401) {
      // 用户认证失败  若传递token,但token过期,则返回401

      /* 
				token过期 根据refresh-token获取新的token  
				1-发送请求 获取新的token
				2-根据新的token重新发送请求 实现无感刷新
			
			 */
      const { user } = store.state;
      if (!user || !user.refresh_token) {
        // 完全没有登陆过  无token
        return router.push("/login");
      }
      // 有token 但是 token过期
      try {
        //  根据 refresh_token  获取新的token
        const { data } = await requestFreshToken({
          method: "PUT",
          url: "/v1_0/authorizations",
          headers: {
            Authorization: "Bearer " + user.refresh_token
          }
        });
        // 重新对user中token进行赋值
        user.token = data.data.token;
        // 将新的user对象重新存到store中
        store.commit("setUser", user);
        //  这里重新发送请求后  使用的是request  又会走上面的请求拦截  又会重新携带刚刚存的新的token
        return request(error.response.config);
      } catch (error) {}
      //  捕获异常就直接重新登陆
      return router.push("/login");

      Toast.file("用户认证失败");
    } else if (status == 403) {
      // 客户端没有权限
      Toast.file("客户端没有权限");
    } else if (status == 405) {
      //  请求方法不支持
      Toast.file("请求方法不支持");
    }
    return Promise.reject(error);
  }
);

export default request;

到此这篇关于React如何使用refresh_token实现无感刷新页面的文章就介绍到这了!


Tags in this post...

Javascript 相关文章推荐
JavaScript Event学习第十章 一些可替换的事件对
Feb 10 Javascript
js控制当再次点击按钮时的间隔时间
Jun 03 Javascript
jQuery实现友好的轮播图片特效
Jan 12 Javascript
JS获取Table中td值的方法
Mar 19 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
Apr 07 Javascript
浅谈js中的延迟执行和定时执行
May 31 Javascript
js输入框使用正则表达式校验输入内容的实例
Feb 12 Javascript
JavaScript获取select中text值的方法
Feb 13 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
Aug 16 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
使用express搭建一个简单的查询服务器的方法
Feb 09 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
Jul 06 Javascript
如何vue使用el-table遍历循环表头和表体数据
详细介绍Next.js脚手架完整搭建封装
Apr 26 #Javascript
vue 把二维或多维数组转一维数组
Apr 24 #Vue.js
Vue OpenLayer 为地图绘制风场效果
Apr 24 #Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
vue @click.native 绑定原生点击事件
Apr 22 #Vue.js
vue实现省市区联动 element-china-area-data插件
You might like
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
php中使用array_filter()函数过滤空数组的实现代码
2014/08/19 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
ie focus bug 解决方法
2009/09/03 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
react项目从新建到部署的实现示例
2021/02/19 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
Django配置文件代码说明
2019/12/04 Python
python 实现Harris角点检测算法
2020/12/11 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
北京SQL新华信咨询
2016/09/30 面试题
《小草和大树》教学反思
2014/02/16 职场文书
会计求职信范文
2014/05/24 职场文书
学校工作推荐信范文
2014/07/11 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang
利用uni-app生成微信小程序的踩坑记录
2022/04/05 Javascript
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技