使用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保留小数点的4种效果实现代码分享
Apr 12 Javascript
JavaScript中的Math 使用介绍
Apr 21 Javascript
window.onerror()的用法与实例分析
Jan 27 Javascript
AngularJS中处理多个promise的方式
Feb 02 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
Mar 05 Javascript
JS三目运算(三元运算)方法详解
Mar 01 Javascript
利用vscode编写vue的简单配置详解
Jun 17 Javascript
babel的使用及安装配置教程
Feb 22 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
May 10 Javascript
JS数组属性去重并校验重复数据
Jan 10 Javascript
Vue 禁用浏览器的前进后退操作
Sep 04 Javascript
vue常用高阶函数及综合实例
Feb 25 Vue.js
如何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
php4的session功能评述(一)
2006/10/09 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
python处理二进制数据的方法
2015/06/03 Python
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
使用C++扩展Python的功能详解
2018/01/12 Python
Python logging模块用法示例
2018/08/28 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
Python如何对齐字符串
2020/07/30 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
python给list排序的简单方法
2020/12/10 Python
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
日语专业毕业生自荐信
2013/11/11 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
元旦寄语大全
2014/04/10 职场文书
股东合作协议书范本
2014/04/14 职场文书
职称评定个人总结
2015/03/05 职场文书
宾馆客房管理制度
2015/08/06 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL