最近在項目開發中,遇到下面這樣一個問題:ios
在進行銘感操做以前,每一個請求須要攜帶token,可是token 有有效期,token 失效後須要換取新的token並繼續請求。
token invalid
,可是咱們不能在每一個請求以後去作刷新 token
的操做呀,因此這裏咱們就用 axios response 攔截器,咱們統一處理全部請求成功以後響應過來的數據,而後對特殊數據進行處理,其餘的正常分發。分析完問題後,咱們來實現功能axios
main.js
註冊 axiosVue.use(Vuex) Vue.use(VueAxios, axios) Vue.use(qs)
注:
qs
,使用axios,必須得安裝 qs,全部的Post 請求,咱們都須要 qs,對參數進行序列化。
request
攔截器實現axios.interceptors.request.use( config => { config.baseURL = '/api/' config.withCredentials = true // 容許攜帶token ,這個是解決跨域產生的相關問題 config.timeout = 2500 let token = sessionStorage.getItem('access_token') let csrf = store.getters.csrf if (token) { config.headers = { 'access-token': token, 'Content-Type': 'application/x-www-form-urlencoded' } } if (config.url === 'refresh') { config.headers = { 'refresh-token': sessionStorage.getItem('refresh_token'), 'Content-Type': 'application/x-www-form-urlencoded' } } return config }, error => { return Promise.reject(error) } )
response
攔截器實現axios.interceptors.response.use( response => { // 定時刷新access-token if (!response.data.value && response.data.data.message === 'token invalid') { // 刷新token store.dispatch('refresh').then(response => { sessionStorage.setItem('access_token', response.data) }).catch(error => { throw new Error('token刷新' + error) }) } return response }, error => { return Promise.reject(error) } )