vue 拦截器拦截401重新请求Token 无感刷新Token 之后重新请求报401的接口
instance. interceptors. response. use (
async ( response ) => {
let { data } = response;
if ( data. code === 401 || data. code === 403 ) {
return await handleExpiredToken ( response. config) ;
}
if ( data. code !== 200 ) {
return Promise. reject ( data) ;
} else {
return Promise. resolve ( data) ;
}
} ,
async ( error ) => {
if ( ! error || ! error. response) {
handleNetworkError ( ) ;
return Promise. reject ( 'Network anomaly' ) ;
}
switch ( error. response. status) {
case 401 :
case 403 :
return await handleExpiredToken ( error. config) ;
case 500 :
handleServerError ( error. response. data. code) ;
break ;
case 502 :
Message. error ( 'Server error' ) ;
break ;
default :
break ;
}
return Promise. reject ( error. response. data. message) ;
}
) ;
let isRefreshing = false ;
let pendingRequests = [ ] ;
const handleExpiredToken = async ( originalRequest ) => {
if ( isRefreshing) {
return new Promise ( ( resolve, reject ) => {
pendingRequests. push ( { originalRequest, resolve, reject } ) ;
} ) ;
}
isRefreshing = true ;
try {
const params = {
refreshToken : localStorage. getItem ( 'refreshToken' ) ,
grantType : 'refreshToken'
} ;
const response = await login ( params) ;
const { accessToken, refreshToken } = response. data;
localStorage. setItem ( 'token' , accessToken) ;
localStorage. setItem ( 'refreshToken' , refreshToken) ;
processPendingRequests ( accessToken) ;
originalRequest. headers[ 'Authorization' ] = ` Bearer ${ accessToken} ` ;
return await instance ( originalRequest) ;
} catch ( error) {
console. log ( 'error--------' , error) ;
localStorage. clear ( ) ;
router. push ( '/login' ) ;
processPendingRequests ( null ) ;
} finally {
isRefreshing = false ;
}
}
const processPendingRequests = ( accessToken ) => {
pendingRequests. forEach ( ( { originalRequest, resolve, reject } ) => {
if ( accessToken) {
originalRequest. headers[ 'Authorization' ] = ` Bearer ${ accessToken} ` ;
resolve ( instance ( originalRequest) ) ;
} else {
reject ( 'Token refresh failed' ) ;
}
} ) ;
pendingRequests = [ ] ;
} ;