109 lines
3.3 KiB
JavaScript
109 lines
3.3 KiB
JavaScript
/*
|
|
* @Author: Do not edit
|
|
* @Date: 2023-11-20 11:02:29
|
|
* @LastEditTime: 2024-01-10 17:31:37
|
|
* @LastEditors: DY
|
|
* @Description:
|
|
*/
|
|
import axios from 'axios'
|
|
import { getTenantId, getAccessToken, getRefreshToken, setToken } from '@/utils/auth'
|
|
import { refreshToken } from '@/api/login'
|
|
|
|
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
|
|
|
|
const service = axios.create({
|
|
// baseURL: 'http://192.168.0.33:48082/admin-api',
|
|
baseURL: 'http://192.168.0.33:48082/admin-api',
|
|
timeout: 30000,
|
|
withCredentials: false
|
|
})
|
|
|
|
// 是否显示重新登录
|
|
export const isRelogin = { show: false }
|
|
// 是否正在刷新中
|
|
let isRefreshToken = false
|
|
// 请求队列
|
|
let requestList = []
|
|
|
|
// request拦截器
|
|
service.interceptors.request.use(config => {
|
|
// 设置租户
|
|
const tenantId = getTenantId()
|
|
config.headers['tenant-id'] = tenantId
|
|
// 是否需要设置 token
|
|
const isToken = (config.headers || {}).isToken === false
|
|
if (getAccessToken() && !isToken) {
|
|
config.headers.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token 请根据实际情况自行修改
|
|
}
|
|
return config
|
|
})
|
|
|
|
// 响应拦截器
|
|
service.interceptors.response.use(async res => {
|
|
// return Promise.reject(error)
|
|
// 访问令牌过期
|
|
if (res.data.code === 401) {
|
|
if (!isRefreshToken) {
|
|
isRefreshToken = true
|
|
// 1. 如果获取不到刷新令牌,则只能执行登出操作
|
|
if (!getRefreshToken()) {
|
|
return handleAuthorized()
|
|
}
|
|
// 2. 进行刷新访问令牌
|
|
try {
|
|
const refreshTokenRes = await refreshToken()
|
|
// 2.1 刷新成功,则回放队列的请求 + 当前请求
|
|
if (refreshTokenRes.data.code === 0) {
|
|
setToken(refreshTokenRes.data.data)
|
|
requestList.forEach(cb => cb())
|
|
return service(res.config)
|
|
} else {
|
|
return handleAuthorized()
|
|
}
|
|
} catch (e) { // 为什么需要 catch 异常呢?刷新失败时,请求因为 Promise.reject 触发异常。
|
|
// 2.2 刷新失败,只回放队列的请求
|
|
requestList.forEach(cb => cb())
|
|
// 提示是否要登出。即不回放当前请求!不然会形成递归
|
|
return handleAuthorized()
|
|
} finally {
|
|
requestList = []
|
|
isRefreshToken = false
|
|
}
|
|
} else {
|
|
// 添加到队列,等待刷新获取到新的令牌
|
|
return new Promise(resolve => {
|
|
requestList.push(() => {
|
|
res.config.headers.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token 请根据实际情况自行修改
|
|
resolve(service(res.config))
|
|
})
|
|
})
|
|
}
|
|
} else {
|
|
return res
|
|
}
|
|
// if (res.dat)
|
|
})
|
|
|
|
function handleAuthorized () {
|
|
if (!isRelogin.show) {
|
|
isRelogin.show = true
|
|
this.$message.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
|
|
confirmButtonText: '重新登录',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}
|
|
).then(() => {
|
|
isRelogin.show = false
|
|
this.$router.push({ path: '/' })
|
|
// store.dispatch('LogOut').then(() => {
|
|
// location.href = getPath('/index');
|
|
// })
|
|
}).catch(() => {
|
|
isRelogin.show = false
|
|
})
|
|
}
|
|
return Promise.reject(new Error('无效的会话,或者会话已过期,请重新登录。'))
|
|
}
|
|
|
|
export default service
|