Vue 消除Token过期时刷新页面的重复提示

1、问题现象

页面长时间未操作,再刷新页面时,第一次弹出”token失效,请重新登录!”提示,然后跳转到登录页面,接下来又弹出了n个”Token已过期”的后端返回消息提示。

2、原因分析

当前页面初始化,有多个向后端查询系统参数的调用,代码如下:

  created () {
    // ========================================================================
    // 获取需要的系统参数,注意:getParameterClass方法是异步加载数据的。
    // 如需要打印观察,需要通过watch来处理

    // 获取用户类型的参数类别
    this.commonFuncs.getParameterClass(this,"user_type","userTypeList","userTypeMap");

    // 获取用户状态的参数类别
    for(var i = 0; i < this.userStatusList.length; i++){
      var item = this.userStatusList[i];
      var mapKey = parseInt(item.itemKey);
      this.userStatusMap.set(mapKey, item);
    }

    // 获取性别的参数类别
    this.commonFuncs.getParameterClass(this,"gender","","genderMap");

    // 获取部门的参数类别
    this.commonFuncs.getParameterClass(this,"department","","deptMap");

    // 获取角色的参数类别
    this.commonFuncs.getParameterClass(this,"role","","roleMap");

    // 查询用户记录
    this.queryUsers();
  },

这些请求,是axios调用,是异步执行的,因此,刷新页面时,这些请求几乎立即就发出了。然后,这些请求的响应会陆续返回。

响应首先被下面的response拦截器处理:

// token相关的response拦截器
instance.interceptors.response.use(response => {
  if (response) {
    switch (response.data.code) {
      case 3: //token为空
      case 4: //token过期
      case 5: //token不正确
        localStorage.clear();     //删除用户信息
        alert('token失效,请重新登录!');
        // 要跳转登陆页
        router.replace({
              path: '/login',
        });
        break;
      case 6: //禁止访问
        // 跳到403页面
        router.replace({
          path: '/forbidden',
        });
        break;
      default:
        break;
    }
  }
  return response;
}, error => {
  return Promise.reject(error.response.data.message) //返回接口返回的错误信息
})

然后再进入请求调用处的代码:

    this.instance.getParameterClass(
      this.$baseUrl, {"classKey" : classKey}
    ).then(res => {
      //console.log(res.data);
      if (res.data.code == parent.global.SucessRequstCode){
        // 如果查询成功
        // 成功的处理代码...

      }else{
        alert(res.data.message);
      }
    }).catch(error => {
      //alert('查询系统参数失败!');
      console.log(error);
    });

现在的问题:

3、解决方案

编写一个公共方法,检查是否是被拦截处理的返回码,放于/src/common/commonFuncs.js文件中,代码如下:

  /**
   * 判断是否被拦截处理的返回码,返回true,表示被拦截
   * 此方法的作用是调用处,无需处理被拦截的返回码的错误提示
   * @param {请求的返回码} code
   */
  isInterceptorCode(code){
    switch (code) {
      case 3: //token为空
      case 4: //token过期
      case 5: //token不正确
      case 6: //禁止访问
        return true;
      default:
        break;
    }
    return false;
  }

然后所有调用处,针对非成功返回的处理均改为:

        if (!this.commonFuncs.isInterceptorCode(res.data.code)){
          alert(res.data.message);
        }

这样,消除了拦截处理和调用处理的重复告警。

在全局变量文件/src/common/global.js中,增加token无效标记,代码如下:

//全局变量

export default {
  // 请求成功返回码
  SucessRequstCode:0,

  // token无效标记
  TokenInvalidFlag : 0
}

然后,修改拦截器代码:

// token相关的response拦截器
instance.interceptors.response.use(response => {
  if (response) {
    switch (response.data.code) {
      case 0: //正常
        // 复位token无效标记置
        global.TokenInvalidFlag = 0;
        break;
      case 3: //token为空
      case 4: //token过期
      case 5: //token不正确
        if (global.TokenInvalidFlag == 0){
          //删除用户信息
          localStorage.clear();
          // 告警提示
          alert('token失效,请重新登录!');
          // token无效标记置1
          global.TokenInvalidFlag = 1;
          // 要跳转登陆页
          router.replace({
                path: '/login',
          });
        break;
      case 6: //禁止访问
        // 跳到403页面
        router.replace({
          path: '/forbidden',
        });
        break;
      default:
        break;
    }
  }
  return response;
}, error => {
  return Promise.reject(error.response.data.message) //返回接口返回的错误信息
})

即在第一次收到token过期消息(此时TokenInvalidFlag=0)时,进行提示,然后设置为1(此时TokenInvalidFlag=1),后续的若干个请求的响应,都不会在告警提示了。直到收到成功返回码时复位为0,此时表示重新登录成功了。

经测试,这样处理达到预期效果,即token过期时,刷新页面,只提示一次告警。

Original: https://www.cnblogs.com/alabo1999/p/14983429.html
Author: 阿拉伯1999
Title: Vue 消除Token过期时刷新页面的重复提示

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610220/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 22.1.7 master公式及O(NLogN)的排序

    22.1.7 master公式及O(NLogN)的排序 1 master 公式 (1) 写公式 T(N) = a * T(N/b) + O(N^d); master公式用来求递归行…

    Java 2023年6月13日
    092
  • 异步、邮件、定时任务

    异步、邮件、定时任务 14.1 异步任务 编写一个业务测试类 文件路径:com–dzj–service–AsynService.java @Se…

    Java 2023年6月5日
    080
  • java重试

    重试 重试,就是多试几次。一次不成功,多试几次说不定就成功了。 什么时候重试? 要执行的逻辑比较重要,或者是服务不稳定,或者是Rpc远程调服务有时不成功,都可以使用重试。 示例代码…

    Java 2023年5月29日
    074
  • [springmvc]ajax异步请求数据详细简单

    10.Ajax异步请求 Ajax即 Asynchronous Javascript And XML(异步JavaScript和XML在 2005年被Jesse James Garr…

    Java 2023年6月6日
    078
  • java操作JDBC实现增删改查工具类

    删除语句 package com;​import com.sun.xml.internal.bind.v2.model.core.ID;import com.util.jdbcut…

    Java 2023年6月7日
    094
  • maven打包scala+java工程

    在 scala和java混合编程的时候,需要添加一些额外的配置到pom中,才能将scala文件的class加到最终的jar中 打包的命令 Original: https://www…

    Java 2023年5月29日
    073
  • Spring框架中bean的生命周期

    Spring对bean进行实例化; Spring将值和bean的引用注入到bean对应的属性中; 如果bean实现了BeanNameAware接口,Spring将bean的ID传递…

    Java 2023年6月13日
    076
  • 筛选两个集合不同数据

    undefined 谁在最外面,最后返回的集合就是谁的数据,例子中返回的集合数据是newSupplierBiznoDetail的不同数据List collect = newSupp…

    Java 2023年6月9日
    096
  • 数据库操作

    数据库操作 数据库基础数据库是一种 存储结构, 允许使用各种格式 输入、处理、检索 数据,且不用在每次需要数据时 重新输入数据。 select 语句: select语句 用于查询数…

    Java 2023年6月9日
    085
  • JVM学习 类加载子系统

    JVM 哔哩哔哩 尚硅谷视频 宋红康老师 Java代码执行流程 简图 详细图 1、类加载子系统 类加载器子系统的作用 类加载器子系统负责从文件系统或者网络中加载Class文件,cl…

    Java 2023年6月16日
    083
  • ssm中获取request

    ServletRequestAttributes 和 RequestContextHolder 使用ssm自带类进行获取request ServletRequestAttribut…

    Java 2023年6月9日
    083
  • java学习笔记1(入门级)

    JavaSE (Java标准版) JavaEE(Java企业版) JavaME(Java微型版) 简单性:例如C++支持多继承,多继承比较复杂,而Java不在支持多继承 C++中有…

    Java 2023年6月16日
    077
  • 竟然有一半的人不知道 for 与 foreach 的区别???

    之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说了一下是否能删除,以及原因;接下来我们来探讨一下是否能够如此; 首先,我们一一段…

    Java 2023年5月29日
    091
  • SpringBoot 2.0整合阿里云OSS,实现动静分离架构

    前言 相信大部分开发者对下面这张架构图并不陌生吧,现在很多网站/应用都采用了动静分离的架构进行部署。博主的博客也不例外,主机采用的是阿里云的 ECS,使用 CDN 做静态内容分发,…

    Java 2023年5月30日
    064
  • 3.12美团

    1.幸运数字 class Test { public static void main(String[] args) { Scanner scanner = new Scanner…

    Java 2023年6月5日
    069
  • 子程序(一个方法)中出现多个返回语句

    子程序中不建议出现过多的返回语句,尽量减少子程序返回语句的数量。 Original: https://www.cnblogs.com/txzn/p/16600520.htmlAut…

    Java 2023年6月5日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球