@@ -12,7 +12,7 @@ import {
12
12
import { stringify } from "qs" ;
13
13
import NProgress from "../progress" ;
14
14
// import { loadEnv } from "@build/index";
15
- import { getToken } from "@/utils/auth" ;
15
+ import { getToken , formatToken } from "@/utils/auth" ;
16
16
import { useUserStoreHook } from "@/store/modules/user" ;
17
17
18
18
// 加载环境变量 VITE_PROXY_DOMAIN(开发环境) VITE_PROXY_DOMAIN_REAL(打包后的线上环境)
@@ -43,27 +43,43 @@ class PureHttp {
43
43
this . httpInterceptorsRequest ( ) ;
44
44
this . httpInterceptorsResponse ( ) ;
45
45
}
46
+
47
+ /** token过期后,暂存待执行的请求 */
48
+ private static requests = [ ] ;
49
+
50
+ /** 防止重复刷新token */
51
+ private static isRefreshing = false ;
52
+
46
53
/** 初始化配置对象 */
47
54
private static initConfig : PureHttpRequestConfig = { } ;
48
55
49
56
/** 保存当前Axios实例对象 */
50
57
private static axiosInstance : AxiosInstance = Axios . create ( defaultConfig ) ;
51
58
59
+ /** 重连原始请求 */
60
+ private static retryOriginalRequest ( config : PureHttpRequestConfig ) {
61
+ return new Promise ( resolve => {
62
+ PureHttp . requests . push ( ( token : string ) => {
63
+ config . headers [ "Authorization" ] = formatToken ( token ) ;
64
+ resolve ( config ) ;
65
+ } ) ;
66
+ } ) ;
67
+ }
68
+
52
69
/** 请求拦截 */
53
70
private httpInterceptorsRequest ( ) : void {
54
71
PureHttp . axiosInstance . interceptors . request . use (
55
72
async ( config : PureHttpRequestConfig ) => {
56
- const $config = config ;
57
73
// 开启进度条动画
58
74
NProgress . start ( ) ;
59
75
// 优先判断post/get等方法是否传入回掉,否则执行初始化设置等回掉
60
76
if ( typeof config . beforeRequestCallback === "function" ) {
61
- config . beforeRequestCallback ( $ config) ;
62
- return $ config;
77
+ config . beforeRequestCallback ( config ) ;
78
+ return config ;
63
79
}
64
80
if ( PureHttp . initConfig . beforeRequestCallback ) {
65
- PureHttp . initConfig . beforeRequestCallback ( $ config) ;
66
- return $ config;
81
+ PureHttp . initConfig . beforeRequestCallback ( config ) ;
82
+ return config ;
67
83
}
68
84
/** 请求白名单,放置一些不需要token的接口(通过设置请求白名单,防止token过期后再请求造成的死循环问题) */
69
85
const whiteList = [ "/refreshToken" , "/login" ] ;
@@ -75,21 +91,30 @@ class PureHttp {
75
91
const now = new Date ( ) . getTime ( ) ;
76
92
const expired = parseInt ( data . expires ) - now <= 0 ;
77
93
if ( expired ) {
78
- // token过期刷新
79
- useUserStoreHook ( )
80
- . handRefreshToken ( { refreshToken : data . refreshToken } )
81
- . then ( res => {
82
- config . headers [ "Authorization" ] =
83
- "Bearer " + res . data . accessToken ;
84
- resolve ( $config ) ;
85
- } ) ;
94
+ if ( ! PureHttp . isRefreshing ) {
95
+ PureHttp . isRefreshing = true ;
96
+ // token过期刷新
97
+ useUserStoreHook ( )
98
+ . handRefreshToken ( { refreshToken : data . refreshToken } )
99
+ . then ( res => {
100
+ const token = res . data . accessToken ;
101
+ config . headers [ "Authorization" ] = formatToken ( token ) ;
102
+ PureHttp . requests . forEach ( cb => cb ( token ) ) ;
103
+ PureHttp . requests = [ ] ;
104
+ } )
105
+ . finally ( ( ) => {
106
+ PureHttp . isRefreshing = false ;
107
+ } ) ;
108
+ }
109
+ resolve ( PureHttp . retryOriginalRequest ( config ) ) ;
86
110
} else {
87
- config . headers [ "Authorization" ] =
88
- "Bearer " + data . accessToken ;
89
- resolve ( $config ) ;
111
+ config . headers [ "Authorization" ] = formatToken (
112
+ data . accessToken
113
+ ) ;
114
+ resolve ( config ) ;
90
115
}
91
116
} else {
92
- resolve ( $ config) ;
117
+ resolve ( config ) ;
93
118
}
94
119
} ) ;
95
120
} ,
0 commit comments