Browse Source

session过期自动跳转到登录页面

master
han\hanst 4 weeks ago
parent
commit
1584f7406c
  1. 25
      src/router/index.js
  2. 76
      src/utils/httpRequest.js

25
src/router/index.js

@ -52,13 +52,14 @@ const mainRoutes = {
{ path: '/customer_report_show', component: _import('modules/report/customer_report_show'), name: 'report', meta: { title: '自定义报表展示' } },//2022-04-20 自定义报表路径 { path: '/customer_report_show', component: _import('modules/report/customer_report_show'), name: 'report', meta: { title: '自定义报表展示' } },//2022-04-20 自定义报表路径
], ],
beforeEnter (to, from, next) { beforeEnter (to, from, next) {
let token =Vue.cookie.get('token')
let token = Vue.cookie.get('token')
if (!token || !/\S/.test(token)) { if (!token || !/\S/.test(token)) {
clearLoginInfo() clearLoginInfo()
next({ name: 'login' }) next({ name: 'login' })
}
} else {
next() next()
} }
}
} }
const router = new Router({ const router = new Router({
@ -69,6 +70,16 @@ const router = new Router({
}) })
router.beforeEach((to, from, next) => { 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 全局路由, 直接访问 // 1. 已经添加 or 全局路由, 直接访问
// 2. 获取菜单列表, 添加并保存本地存储 // 2. 获取菜单列表, 添加并保存本地存储
@ -89,6 +100,12 @@ router.beforeEach((to, from, next) => {
sessionStorage.setItem('menuList', JSON.stringify(data.menuList || '[]')) sessionStorage.setItem('menuList', JSON.stringify(data.menuList || '[]'))
sessionStorage.setItem('permissions', JSON.stringify(data.permissions || '[]')) sessionStorage.setItem('permissions', JSON.stringify(data.permissions || '[]'))
next({ ...to, replace: true }) next({ ...to, replace: true })
} else if (data && data.code === 401) {
// session过期
console.log('会话已过期,跳转至登录页')
clearLoginInfo()
next({ name: 'login' })
return
} else { } else {
sessionStorage.setItem('menuList', '[]') sessionStorage.setItem('menuList', '[]')
sessionStorage.setItem('permissions', '[]') sessionStorage.setItem('permissions', '[]')
@ -96,7 +113,9 @@ router.beforeEach((to, from, next) => {
} }
}).catch((e) => { }).catch((e) => {
console.log(`%c${e} 请求菜单列表和权限失败,跳转至登录页!!`, 'color:blue') console.log(`%c${e} 请求菜单列表和权限失败,跳转至登录页!!`, 'color:blue')
router.push({ name: 'login' })
clearLoginInfo()
next({ name: 'login' })
return
}) })
} }
}) })

76
src/utils/httpRequest.js

@ -35,6 +35,27 @@ http.interceptors.response.use(response => {
} }
return response return response
}, error => { }, 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) return Promise.reject(error)
}) })
@ -108,6 +129,27 @@ instance.interceptors.response.use(response => {
} }
return response return response
}, error => { }, 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) return Promise.reject(error)
}) })
@ -143,6 +185,40 @@ instance2.interceptors.response.use(response => {
} }
return response return response
}, error => { }, 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) return Promise.reject(error)
}) })

Loading…
Cancel
Save