使用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 相关文章推荐
js 函数调用模式小结
Dec 26 Javascript
JS格式化数字金额用逗号隔开保留两位小数
Oct 18 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
May 11 Javascript
JavaScript常用脚本汇总(二)
Mar 04 Javascript
使用JavaScript获取Request中参数的值方法
Sep 27 Javascript
Vue监听数据对象变化源码
Mar 09 Javascript
原生JS实现圆环拖拽效果
Apr 07 Javascript
AngularJS表单验证功能分析
May 26 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
Oct 26 Javascript
微信小程序数字滚动插件使用详解
Feb 02 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
Jun 13 Javascript
es6中Promise 对象基本功能与用法实例分析
Feb 23 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
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
在Django框架中设置语言偏好的教程
2015/07/27 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
软件测试工程师面试问题精选
2016/10/28 面试题
工程造价自荐信
2013/10/09 职场文书
开朗女孩的自我评价
2014/02/10 职场文书
开工仪式主持词
2014/03/20 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
六年级语文教学反思
2016/03/03 职场文书
教你如何用cmd快速登录服务器
2022/06/10 Servers