vue token过期处理,vue无痛刷新token

  vue token过期处理,vue无痛刷新token

  很多朋友在令牌过期的时候刷新页面,页面很久没人操作了。再次刷新页面时,“令牌无效,请重新登录!”第一次弹出提示,这个问题怎么处理?下面小编就给大家带来原因分析和解决方法。让我们看一看。

  当令牌过期时,刷新页面。如果在页面加载时有多个请求发送到后端,将会重复报警提示。处理后,只会提示一个报警。

  

1、问题现象

  页面长时间不操作,再次刷新页面时“token无效,请重新登录!”第一次弹出提示,然后跳转到登录页面,接着是N次后端返回“令牌已过期”的消息提示。

  

2、原因分析

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

  已创建(){

  //========================================================================

  //获取所需的系统参数。注意:getParameterClass方法异步加载数据。

  //如果需要打印观测,需要通过watch处理。

  //获取用户类型的参数类别

  this . common funcs . getparameter class(this, user_type , userTypeList , user type map );

  //获取用户状态的参数类别

  for(var I=0;I this . userstatuslist . length;i ){

  var item=this . userstatuslist[I];

  var mapKey=parse int(item . item key);

  this.userStatusMap.set(mapKey,item);

  }

  //获取性别的参数类别

  this . common funcs . getparameter class(this, gender ,, gender map );

  //获取部门的参数类别

  this . common funcs . getparameter class(this, department ,, dept map );

  //获取角色的参数类别

  this . common funcs . getparameter class(this, role ,, role map );

  //查询用户记录

  this . queryusers();

  },

  这些请求是axios调用,异步执行,因此当页面刷新时,这些请求几乎是立即发出的。然后,对这些请求的响应将被一个接一个地返回。

  响应首先由以下响应拦截器处理:

  //与令牌相关的响应拦截器

  instance . interceptors . response . use(response={

  如果(响应){

  switch (response.data.code) {

  3://令牌为空

  情况4://令牌过期

  5://令牌不正确

  local storage . clear();//删除用户信息

  Alert(令牌无效,请重新登录!);

  //跳转到登录页面

  router.replace({

  路径:“/login”,

  });

  打破;

  6://禁止访问

  //跳到第403页

  router.replace({

  路径:“/禁止”,

  });

  打破;

  默认值:

  打破;

  }

  }

  返回响应;

  },错误={

  return promise . reject(error . response . data . message)//返回接口返回的错误信息

  })

  然后输入调用请求的代码:

  this . instance . getparameterclass(

  这个。$baseUrl,{classKey : classKey}

  ).然后(res={

  //console . log(RES . data);

  if(RES . data . code==parent . global . successrequstcode){

  //如果查询成功

  //成功处理代码.

  }否则{

  alert(RES . data . message);

  }

  }).catch(错误={

  //alert(查询系统参数失败!);

  console.log(错误);

  });

  现在的问题是:

  对应一个请求,如果令牌过期,响应拦截器会先弹出一个报警提示,然后调用处会有提示:

  alert(RES . data . message);

  如此反复。

  对于同时发送的多个请求,需要有一个标记来记住令牌是否过期,只提示一次。如果有,就不需要再提示了。

  

3、解决方案

  3.1.消除拦截器和请求调用处令牌过期的重复提示。

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

  /**

  *返回代码来判断是否被拦截,返回true,表示被拦截

  *这个方法的作用是调用的地方不处理拦截的返回代码的错误提示。

  * @ param {请求的返回代码}代码

  */

  isInterceptorCode(代码){

  开关(代码){

  3://令牌为空

  情况4://令牌过期

  5://令牌不正确

  6://禁止访问

  返回true

  默认值:

  打破;

  }

  返回false

  }

  然后,在所有呼叫中,对不成功退货的处理将更改为:

  如果(!this . common funcs . is interceptorcode(RES . data . code)){

  alert(RES . data . message);

  }

  这样就消除了拦截处理和呼叫处理的重复告警。

  3.2.多个请求的处理只提示一次。

  在全局变量文件/src/common/global.js中,使用以下代码添加一个无效标记:

  //全局变量

  导出默认值{

  //请求成功返回代码

  成功请求代码:0,

  //无效的标记

  TokenInvalidFlag : 0

  }

  然后,修改拦截器代码:

  //与令牌相关的响应拦截器

  instance . interceptors . response . use(response={

  如果(响应){

  switch (response.data.code) {

  0://正常

  //重置无效令牌标志。

  全球。TokenInvalidFlag=0;

  打破;

  3://令牌为空

  情况4://令牌过期

  5://令牌不正确

  local storage . clear();//删除用户信息

  如果(全局。TokenInvalidCounter==0){

  Alert(令牌无效,请重新登录!);

  }

  //无效令牌标志设置为1。

  全球。TokenInvalidFlag=1;

  //跳转到登录页面

  router.replace({

  路径:“/login”,

  });

  打破;

  6://禁止访问

  //跳到第403页

  router.replace({

  路径:“/禁止”,

  });

  打破;

  默认值:

  打破;

  }

  }

  返回响应;

  },错误={

  return promise . reject(error . response . data . message)//返回接口返回的错误信息

  })

  即第一次收到令牌过期消息时(此时TokenInvalidFlag=0)会给出提示,之后会置1(此时TokenInvalidFlag=1),后续几次请求的响应都不会在告警中提示。它将被重置为0,直到收到成功的返回代码,这表示登录成功。

  经过测试,这种处理达到了预期的效果,即当令牌过期时,页面会刷新,只报警一次。

  作者:阿拉伯语1999来源:http://www.cnblogs.com/alabo1999/.本文版权归作者和博客园所有。欢迎转载,但未经作者同意,必须保留此声明,并在文章页面显著位置给出原文链接,否则保留追究法律责任的权利。养成一个好习惯,好文章随你发。

  这就是这篇关于Vue消除令牌过期时刷新页面的重复提示的文章。更多相关Vue刷新页面的重复提示内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: