方法一
axios.js
响应拦截器中如果返回 401 执行以下方法
/**
* 跳转登录页
* 携带当前页面路由,在登录页面完成登录后返回当前页面
*/
const loginOut = () => {
if(window.localStorage.loginOut == 'false' || window.localStorage.loginOut == undefined){ // 解决:token验证过期,发送多次请求,导致消息多次提示
window.localStorage.loginOut = 'true'; // 更改状态,防止发送多次请求,导致消息多次提示
MessageBox.alert('登陆状态已过期,请重新登录', '提示', {
lockScroll: true,
confirmButtonText: '确定',
confirmButtonClass: 'sureBtn',
closeOnClickModal: false,
closeOnPressEscape: false,
callback:() => {
router.replace({
path: '/',
query: {
redirect: router.currentRoute.fullPath
}
});
window.localStorage.removeItem('zsyftxglptMh');
}
});
}
}
login.vue
let params = {
username: 'username',
password: 'password'
}
this.$axios.login(params).then(res => {
let resData = res.data;
let userInfo = {
userId: resData.data.user.id,
userName: resData.data.user.name,
token: resData.data.user.token
}
// 用户信息 设置 缓存
window.localStorage.zsyftxglptMh = JSON.stringify(userInfo);
// 获取 最新 token 之后,将 loginOut 设置为 false,以便下次 token 失效后,再次执行 响应拦截器(跳转登录页)
window.localStorage.loginOut = 'false';
});
方法二
创建 messageOnce.js
import { Message, MessageBox } from "element-ui";
// 私有属性,只在当前文件可用
const showMessage = Symbol('showMessage');
const showMessageBox = Symbol('showMessageBox');
export default class domMessage {
// Message
message(options, single = true) {
this[showMessage](options);
}
[showMessage](options) {
if (single) {
// 判断当前页是否有 el-message 标签,如果没有则执行消息提示操作
if (document.getElementsByClassName('el-message').length === 0){
Message(options)
}
} else {
Message(options)
}
}
// MessageBox
messageBox(options, single = true) {
this[showMessageBox](options, single);
}
[showMessageBox](options, single) {
if (single) {
// 判断当前页是否有 el-message-box 标签,如果没有则执行消息提示操作
if (document.getElementsByClassName('el-message-box').length === 0 || document.getElementsByClassName('el-message-box__wrapper')[0].style.display == "none"){
MessageBox(options)
}
} else {
MessageBox(options)
}
}
}
使用 messageOnce 方法
// axios.js
import Vue from "vue";
import axios from "axios";
import router from "@/router";
import domMessage from './messageOnce' // 引入方法
const messageOnce = new domMessage();
// 添加响应拦截器
axios.interceptors.response.use(response => {
const data = response.data;
if (data.code == 401) {
messageOnce.messageBox({
title: '温馨提示',
message: '登陆状态已过期,请重新登录',
confirmButtonClass: "sureBtn",
callback: () => {
router.push(`/login`);
}
})
return data;
} else {
return data;
}
}, error => {
let data = error.response.data;
return Promise.reject(error);
})