首页 > 其他分享 >vue项目中如何解决出现两次重新登录弹框的问题?

vue项目中如何解决出现两次重新登录弹框的问题?

时间:2023-11-19 20:25:15浏览次数:35  
标签:vue 登录 弹框 flag error data response

举例描述一下业务场景:当token过期,需要用户重新登录时,需要在页面弹框提示重新登录。

显然这个重新登录的提示弹框的逻辑是在响应拦截器中加的,我的代码如下:(只提供部分代码)

 1 // 返回拦截器
 2 service.interceptors.response.use(
 3     response => {
 4         if (response.data.status === -1) {
 5             Message({
 6                 message: response.data.message,
 7                 type: 'error',
 8                 duration: 3 * 1000
 9             })
10         }
11         if (response.headers['content-disposition']) {
12             return response
13         }
14         return response.data
15     },
16     error => {
17         if (error && error.response) {   
19             switch (error.response.status) {
20                 case 401:
21                     if (error.response.data.code) {
23                         MessageBox.confirm(error.response.data.errors || 'Error', '确定重新登录', {
24                             confirmButtonText: '确定',
25                             type: 'warning'
26                         }).then(() => {
27                             store.dispatch('user/resetToken').then(() => {
29                                 router.push('/login')
30                             })
31                         })
33                     }
34                     break;48             }
49         } else {
50             // error.message = '连接失败...'
51         }
52         return Promise.reject(error)
53     }
54 )

问题详细描述:当在token过期的页面如果同时发出多个请求时,就会对应出现多个弹框(注意:我这里用的是elementui提供的messageBox,故弹框是在触发确认或取消按钮按照顺序弹出的。)

这样的展示显示用户体验效果不好,当401时应该出现一次弹框,点击确认直接进入登录页,不需要再出现多余的弹框。那这个问题如何修改呢?

解决方法:

加一个全局变量flag,用来标识记录是否触发过messageBox中的按钮。false是未出现过弹框,true代表出现过一次。在做switch匹配前判断flag是否为true,是则中断执行,否则继续执行,执行完messageBox代码后,需要将flag设为true,且需要注意此时还要加个定时器还原flag的初始值为false。因为取消后如果不把flag还原,则不会再出现提示弹框。以下是代码:

 1 let flag = false
 3 // 返回拦截器
 4 service.interceptors.response.use(
 5    ...
 6     error => {
 7         if (error && error.response) {
 8             if (flag) return
 9             switch (error.response.status) {
10                 case 401:
11                     if (error.response.data.code) {
13                         MessageBox.confirm(error.response.data.errors || 'Error', '确定重新登录', {
14                             confirmButtonText: '确定',
15                             type: 'warning'
16                         }).then(() => {
17                             store.dispatch('user/resetToken').then(() => {
18                                 // location.reload()
19                                 router.push('/login')
20                             })
21                         })
                flag = true         22 setTimeout(() => { 23 flag = false 24 }, 2000); 25 } 26 break; 27 ... 28 } 29 } else { 30 // error.message = '连接失败...' 31 } 32 return Promise.reject(error) 33 } 34 )

 

标签:vue,登录,弹框,flag,error,data,response
From: https://www.cnblogs.com/heisetianshi/p/17842153.html

相关文章

  • 自定义Vue脚手架
    创建一个vue项目,项目名叫custom选择最下面的自定义脚手架选择你需要的配置选择vue版本询问是否采用历史模式,默认是hash模式,history模式需要后端进行额外配置选择CSS预处理器选择eslint规范,这里选择的是无分号的规范选择什么时候进行校验,这里选择的是保存时进行校验......
  • vue slot插槽
      插槽(slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽,可以把插槽认为是组件封装期间,为用户预留的内容的占位符,适用于父组件→子组件,$slots是组件插槽集,是组件所有默认插槽、具名插槽的集合,可以用来获取当前组件的插......
  • springboot3+vue3大事件的展示
    跟着黑马老师,做了一遍收获很大 ......
  • 使用Servlet中的过滤器实现登录权限验证
    {/***@description:登录过滤校验*@author:lijialuo*@date:2023/11/1913:28*@param:[servletRequest,servletResponse,filterChain]*@return:void**/@OverridepublicvoiddoFilter(ServletRequestservletReque......
  • vue项目中,如何去掉报错时出现的黑色遮罩?
    比如在我们发送请求时,返回401,此时出现带有401提示信息的黑色遮罩,我们不想要这个遮罩出现,只需要在控制台有报错信息就好,如下图显示,如何解决呢?解决办法:在vue.config.js文件中配置如下代码即可: ......
  • 【开源】基于Vue.js的天然气工程业务管理系统的设计和实现
    一、摘要1.1项目介绍基于Vue+SpringBoot+MySQL的天然气工程业务管理系统,包含工程项目档案模块、项目进度模块、项目现场照片模块、物资档案模块、物资领用单模块、工程资金申请模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图......
  • 【开源】基于Vue.js的高校学院网站的设计和实现
    一、摘要1.1项目介绍基于Vue2/Vue3+SpringBoot+MySQL的高校学院网站包含学院概况模块、学院院系模块、党建园地模块、竞赛报名模块、教育教学模块、招生就业模块、实时信息模块、新青年风采模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、......
  • Vue中跟 keep-alive 有关的生命周期是哪些?
    在开发Vue项目的时候,大部分组件是没必要多次渲染的,所以Vue提供了一个内置组件keep-alive来缓存组件内部状态,避免重新渲染,在开发Vue项目的时候。生命周期函数:在被keep-alive包含的组件/路由中,会多出两个生命周期的钩子:activated与deactivatedactivated:在组件第一......
  • 前端学习笔记202309学习笔记第九十六天-vue3-什么时候defineModel之1
     ......
  • 前端学习笔记202309学习笔记第九十六天-vue3-什么时候defineOptions之2
    ......