使用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 Date对象使用总结
May 14 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
Sep 03 Javascript
javascript实现可拖动变色并关闭层窗口实例
May 15 Javascript
JavaScript代码生成PDF文件的方法
Feb 26 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
Jul 09 Javascript
在vue项目中,使用axios跨域处理
Mar 07 Javascript
JS实现520 表白简单代码
May 21 Javascript
vue项目打包部署到服务器的方法示例
Aug 27 Javascript
vue实现移动端悬浮窗效果
Dec 01 Javascript
element-ui多文件上传的实现示例
Apr 10 Javascript
vue调用本地摄像头实现拍照功能
Aug 14 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 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读取javascript设置的cookies的代码
2010/04/12 PHP
第六章 php目录与文件操作
2011/12/30 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
python基于queue和threading实现多线程下载实例
2014/10/08 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
pymongo中group by的操作方法教程
2019/03/22 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
物业管理公司实习生自我鉴定
2013/09/19 职场文书
公司酒会主持词
2015/07/02 职场文书
教学副校长工作总结
2015/08/13 职场文书
学校标语口号大全
2015/12/26 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
Python使用DFA算法过滤内容敏感词
2022/04/22 Python