From 1584f7406c30a60be7ae15b5c7e5251ab8e2515b Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Tue, 16 Dec 2025 16:27:01 +0800 Subject: [PATCH] =?UTF-8?q?session=E8=BF=87=E6=9C=9F=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E5=88=B0=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/index.js | 25 +++++++++++-- src/utils/httpRequest.js | 76 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 3 deletions(-) diff --git a/src/router/index.js b/src/router/index.js index 7130997..9138767 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -52,12 +52,13 @@ const mainRoutes = { { path: '/customer_report_show', component: _import('modules/report/customer_report_show'), name: 'report', meta: { title: '自定义报表展示' } },//2022-04-20 自定义报表路径 ], beforeEnter (to, from, next) { - let token =Vue.cookie.get('token') + let token = Vue.cookie.get('token') if (!token || !/\S/.test(token)) { clearLoginInfo() next({ name: 'login' }) + } else { + next() } - next() } } @@ -69,6 +70,16 @@ const router = new Router({ }) router.beforeEach((to, from, next) => { + // 检查登录状态(除了登录页和404页) + if (to.name !== 'login' && to.name !== '404' && !to.path.startsWith('/dashboard-')) { + let token = Vue.cookie.get('token') + if (!token || !/\S/.test(token)) { + clearLoginInfo() + next({ name: 'login' }) + return + } + } + // 添加动态(菜单)路由 // 1. 已经添加 or 全局路由, 直接访问 // 2. 获取菜单列表, 添加并保存本地存储 @@ -89,6 +100,12 @@ router.beforeEach((to, from, next) => { sessionStorage.setItem('menuList', JSON.stringify(data.menuList || '[]')) sessionStorage.setItem('permissions', JSON.stringify(data.permissions || '[]')) next({ ...to, replace: true }) + } else if (data && data.code === 401) { + // session过期 + console.log('会话已过期,跳转至登录页') + clearLoginInfo() + next({ name: 'login' }) + return } else { sessionStorage.setItem('menuList', '[]') sessionStorage.setItem('permissions', '[]') @@ -96,7 +113,9 @@ router.beforeEach((to, from, next) => { } }).catch((e) => { console.log(`%c${e} 请求菜单列表和权限失败,跳转至登录页!!`, 'color:blue') - router.push({ name: 'login' }) + clearLoginInfo() + next({ name: 'login' }) + return }) } }) diff --git a/src/utils/httpRequest.js b/src/utils/httpRequest.js index 0105d14..9e85d7a 100644 --- a/src/utils/httpRequest.js +++ b/src/utils/httpRequest.js @@ -35,6 +35,27 @@ http.interceptors.response.use(response => { } return response }, error => { + // 处理HTTP错误响应 + if (error.response) { + // 服务器返回了错误状态码 + if (error.response.status === 401) { + // HTTP 401 未授权 + clearLoginInfo() + router.push({ name: 'login' }) + return Promise.reject(error) + } + + // 检查响应体中的code字段 + if (error.response.data && error.response.data.code === 401) { + clearLoginInfo() + router.push({ name: 'login' }) + return Promise.reject(error) + } + } else if (error.request) { + // 请求已发出但没有收到响应(网络错误) + console.error('网络请求失败:', error.message) + } + return Promise.reject(error) }) @@ -108,6 +129,27 @@ instance.interceptors.response.use(response => { } return response }, error => { + // 处理HTTP错误响应 + if (error.response) { + // 服务器返回了错误状态码 + if (error.response.status === 401) { + // HTTP 401 未授权 + clearLoginInfo() + router.push({ name: 'login' }) + return Promise.reject(error) + } + + // 检查响应体中的code字段 + if (error.response.data && error.response.data.code === 401) { + clearLoginInfo() + router.push({ name: 'login' }) + return Promise.reject(error) + } + } else if (error.request) { + // 请求已发出但没有收到响应(网络错误) + console.error('网络请求失败:', error.message) + } + return Promise.reject(error) }) @@ -143,6 +185,40 @@ instance2.interceptors.response.use(response => { } return response }, error => { + // 处理HTTP错误响应 + if (error.response) { + // 服务器返回了错误状态码 + if (error.response.status === 401) { + // HTTP 401 未授权 + clearLoginInfo() + router.push({name: 'login'}) + return Promise.reject(error) + } + + // 检查响应体中的code字段(blob响应需要特殊处理) + if (error.response.data) { + // 尝试读取blob中的JSON数据 + const reader = new FileReader() + reader.onload = () => { + try { + const data = JSON.parse(reader.result) + if (data.code === 401) { + clearLoginInfo() + router.push({name: 'login'}) + } + } catch (e) { + // 不是JSON格式,忽略 + } + } + if (error.response.data instanceof Blob) { + reader.readAsText(error.response.data) + } + } + } else if (error.request) { + // 请求已发出但没有收到响应(网络错误) + console.error('网络请求失败:', error.message) + } + return Promise.reject(error) })