使用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权威指南 学习笔记之变量作用域分享
Sep 28 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
Aug 27 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
Node.js DES加密的简单实现
Jul 07 Javascript
H5移动端适配 Flexible方案
Oct 24 Javascript
JavaScript生成.xls文件的代码
Dec 22 Javascript
JavaScript实现数组降维详解
Jan 05 Javascript
React中使用collections时key的重要性详解
Aug 07 Javascript
详解如何使用router-link对象方式传递参数?
May 02 Javascript
Js通过AES加密后PHP用Openssl解密的方法
Jul 12 Javascript
Vue的双向数据绑定实现原理解析
Feb 17 Javascript
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 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
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
详解angular element()方法使用
2017/04/08 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
JS实现滑动插件
2020/01/15 Javascript
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
如何基于python实现脚本加密
2019/12/28 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
会计学应届毕业生推荐信
2013/11/04 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
求职意向书范文
2014/04/01 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
爱心捐书倡议书
2015/04/27 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
护理自荐信
2019/05/14 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js