使用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 闭包疑问
Dec 30 Javascript
javascript中创建对象的三种常用方法
Dec 30 Javascript
使用jquery解析XML示例代码
Sep 05 Javascript
JavaScript实现LI列表数据绑定的方法
Aug 04 Javascript
EasyUI加载完Html内容样式渲染完成后显示
Jul 25 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
Aug 01 Javascript
Google 地图叠加层实例讲解
Aug 06 Javascript
Vue项目全局配置微信分享思路详解
May 04 Javascript
Vue中div contenteditable 的光标定位方法
Aug 25 Javascript
jquery将json转为数据字典的实例代码
Oct 11 jQuery
Vue项目接入Paypal实现示例详解
Jun 04 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 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中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
Python实现二叉搜索树
2016/02/03 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
多个python文件调用logging模块报错误
2020/02/12 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
学生实习自我鉴定
2013/10/11 职场文书
企业管理部经理岗位职责
2013/12/24 职场文书
大三预备党员入党思想汇报
2014/01/08 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
MySQL时间设置注意事项的深入总结
2021/05/06 MySQL
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题