使用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中的apply()方法和call()方法使用介绍
Jul 25 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
Oct 24 Javascript
Javascript Ajax异步读取RSS文档具体实现
Dec 12 Javascript
5种处理js跨域问题方法汇总
Dec 04 Javascript
面向切面编程(AOP)的理解
May 01 Javascript
jQuery采用连缀写法实现的折叠菜单效果
Sep 18 Javascript
javascript给span标签赋值的方法
Nov 26 Javascript
webpack构建的详细流程探底
Jan 08 Javascript
使用Sonarqube扫描Javascript代码的示例
Dec 26 Javascript
angular 服务随记小结
May 06 Javascript
使用异步controller与jQuery实现卷帘式分页
Jun 18 jQuery
使用JavaScript计算前一天和后一天的思路详解
Dec 20 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之CodeIgniter学习笔记
2013/06/17 PHP
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
python制作小说爬虫实录
2017/08/14 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
财务主管自我鉴定
2014/01/17 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
科长竞聘演讲稿
2014/05/16 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
银行员工考核评语
2014/12/31 职场文书
助学金感谢信
2015/01/20 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
JavaScript实现简单拖拽效果
2021/09/15 Javascript
python游戏开发Pygame框架
2022/04/22 Python