可以分为4个部分。
1-A http拦截。 前置双Token方案。
- token刷新白名单接口: 登录接口和刷新token接口绕过
- 当前时间大于过期时间的前三分钟的时候,前端主动替换。调用刷新token接口。置换失败跳入登录页。
- 遇到多次请求,加到promise队列里面,只要超时全部进队列。
promise队列,http config header的Authorization的值为token.
1-B 修改content-type类型
- 判断是否请求方法为get,post,patch,delete这四种之一,如果不是,判断是否是FormData. 是form-dat的话,content-type设置为multipart/form-data
- 响应200,外部200,内部0,结束promise.resolve() 外部200,内部非0的情况下错误处理下一个处理器
1-C 公共错误处理
根据不同的httpcode跳转不同的路由。 401 无权限 403 没有权限,token过期,进行Logout,然后重定向到login页面。 404请求不存在 503请求异常
function resHandleError({ code, message }: IResultType) {
const fullPath = router.currentRoute.value.fullPath
switch (code) {
case 401: // 无权限
antMessage.error(`${message}`)
router.replace({
path: '/notAuth',
})
break
case 403: //token过期
antMessage.error('登录过期,请重新登录')
store
.dispatch('Logout')
.then(() => {
router.replace({ path: '/login', query: { redirect: fullPath } })
})
.catch(error => error)
break
case 404:
antMessage.error('网络请求不存在')
break
case 500:
case 501:
case 503:
antMessage.error('请求异常,请您稍后重试!')
break
default:
antMessage.error(`${message || '请求异常,请您稍后重试!'}`)
break
}
**}**