使用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 出生日期和身份证判断大全
Nov 13 Javascript
javascript Object与Function使用
Jan 11 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
详解javascript传统方法实现异步校验
Jan 22 Javascript
js控件Kindeditor实现图片自动上传功能
Jul 20 Javascript
vue数字类型过滤器的示例代码
Sep 07 Javascript
Node.js实现发送邮件功能
Nov 06 Javascript
vue实现微信分享链接添加动态参数的方法
Apr 29 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
vue cli4.0项目引入typescript的方法
Jul 17 Javascript
vue项目,代码提交至码云,iconfont的用法说明
Jul 30 Javascript
鸿蒙系统中的 JS 开发框架
Sep 18 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
下载文件的点击数回填
2006/10/09 PHP
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
js 中的switch表达式使用示例
2020/06/03 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
python del()函数用法
2013/03/24 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
Linux 修改Python命令的方法示例
2018/12/03 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
解决Django no such table: django_session的问题
2020/04/07 Python
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
《乡愁》教学反思
2014/02/18 职场文书
生态养殖创业计划书
2014/05/06 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
交通违章检讨书
2014/09/21 职场文书
小学教师自我评价
2015/03/04 职场文书
聘任书格式及范文
2015/09/21 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle