解决重复跳转login的bug

This commit is contained in:
2026-09-28 16:53:10 +08:00
parent afedec626f
commit d84048d60a
2 changed files with 38 additions and 10 deletions
+14 -9
View File
@@ -34,7 +34,7 @@ const routes = [
] ]
const router = new VueRouter({ const router = new VueRouter({
mode: 'history', mode: 'history',
base: process.env.BASE_URL, base: process.env.BASE_URL,
routes routes
}) })
@@ -42,15 +42,20 @@ const router = new VueRouter({
// 路由守卫,当访问需要登录的页面时,检查是否有token,如果没有则跳转到登录页 // 路由守卫,当访问需要登录的页面时,检查是否有token,如果没有则跳转到登录页
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
const token = store.state.token; const token = store.state.token;
if(to.meta.requiresAuth) { if (to.meta.requiresAuth) {
// 加入/login判断,防止vue-router报错 // 登录页直接放行
if(!token && to.path !== "/login") { if (to.path === "/login") {
next('/login') next();
return return;
} else {
next()
return
} }
// 其他页面没有 token,不允许进入
if (!token) {
next("/login");
return;
}
next();
} else { } else {
next() next()
} }
+24 -1
View File
@@ -1,5 +1,27 @@
import axios from 'axios'; import axios from 'axios';
import store from '../store'; import store from '../store';
import router from '../router';
let redirectingToLogin = false;
function redirectToLogin() {
if (redirectingToLogin || router.currentRoute.path === '/login') {
return;
}
redirectingToLogin = true;
router.replace('/login').then(
() => {
redirectingToLogin = false;
},
(navigationError) => {
redirectingToLogin = false;
if (navigationError.name !== 'NavigationDuplicated') {
console.error(navigationError);
}
}
);
}
// 配置请求 // 配置请求
const request = axios.create({ const request = axios.create({
@@ -29,9 +51,10 @@ request.interceptors.response.use(
}, },
(error) => { (error) => {
if (error.response && error.response.status === 401) { if (error.response && error.response.status === 401) {
// 如果返回401,说明token过期或无效,清除token // 如果返回401,说明token过期或无效,清除token并跳转到登录页
store.commit('SET_TOKEN', ''); store.commit('SET_TOKEN', '');
store.commit('SET_USERNAME', ''); store.commit('SET_USERNAME', '');
redirectToLogin();
} }
return Promise.reject(error); return Promise.reject(error);
} }