From d84048d60aa13436e39628e4c3f0f99eed3203ea Mon Sep 17 00:00:00 2001 From: Seven <1530011482@qq.com> Date: Mon, 28 Sep 2026 16:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=87=8D=E5=A4=8D=E8=B7=B3?= =?UTF-8?q?=E8=BD=AClogin=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router.js | 23 ++++++++++++++--------- src/utils/request.js | 25 ++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/router.js b/src/router.js index b7cbaa2..6ec4486 100644 --- a/src/router.js +++ b/src/router.js @@ -34,7 +34,7 @@ const routes = [ ] const router = new VueRouter({ - mode: 'history', + mode: 'history', base: process.env.BASE_URL, routes }) @@ -42,15 +42,20 @@ const router = new VueRouter({ // 路由守卫,当访问需要登录的页面时,检查是否有token,如果没有则跳转到登录页 router.beforeEach((to, from, next) => { const token = store.state.token; - if(to.meta.requiresAuth) { - // 加入/login判断,防止vue-router报错 - if(!token && to.path !== "/login") { - next('/login') - return - } else { - next() - return + if (to.meta.requiresAuth) { + // 登录页直接放行 + if (to.path === "/login") { + next(); + return; } + + // 其他页面没有 token,不允许进入 + if (!token) { + next("/login"); + return; + } + + next(); } else { next() } diff --git a/src/utils/request.js b/src/utils/request.js index fc2b635..af83552 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,5 +1,27 @@ import axios from 'axios'; 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({ @@ -29,9 +51,10 @@ request.interceptors.response.use( }, (error) => { if (error.response && error.response.status === 401) { - // 如果返回401,说明token过期或无效,清除token + // 如果返回401,说明token过期或无效,清除token并跳转到登录页 store.commit('SET_TOKEN', ''); store.commit('SET_USERNAME', ''); + redirectToLogin(); } return Promise.reject(error); }