/* * @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