xc-pad/src/utils/request.js
2024-01-10 17:58:43 +08:00

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