使用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实现在小方框中浏览大图的代码
Aug 14 Javascript
基于jQuery图片平滑连续滚动插件
Apr 27 Javascript
JS 面向对象的5钟写法
Jul 31 Javascript
Firefox下提示illegal character并出现乱码的原因
Mar 25 Javascript
获取select元素被选中的文本内容的js代码
Jan 29 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
Jan 24 Javascript
JavaScript实现滑动导航栏效果
Aug 30 Javascript
Vue中插入HTML代码的方法
Sep 21 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
原生JS实现烟花效果
Mar 10 Javascript
vue使用watch监听属性变化
Apr 30 Vue.js
JS前端使用canvas实现扩展物体类和事件派发
Aug 05 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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
调整小数的格式保留小数点后两位
2014/05/14 Javascript
js中运算符&& 和 || 的使用记录
2014/08/21 Javascript
jQuery通过Ajax返回JSON数据
2015/04/28 Javascript
JavaScript中String.prototype用法实例
2015/05/20 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
python求解水仙花数的方法
2015/05/11 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
python中强大的format函数实例详解
2018/12/05 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
python怎么调用自己的函数
2020/07/01 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
试用期员工考核制度
2014/01/22 职场文书
大学生个人求职信
2014/06/02 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
员工2014年度工作总结
2014/12/09 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js