日韩精品欧美激情国产一区_中文无码精品一区二区三区在线_岛国毛片AV在线无码不卡_亞洲歐美日韓精品在線_使劲操好爽好粗视频在线播放_日韩一区欧美二区_八戒八戒网影院在线观看神马_亚洲怡红院在线色网_av无码不卡亚洲电影_国产麻豆媒体MDX

淺談Vue之a(chǎn)xios請求攔截器和響應(yīng)攔截器實際作用

時間:2021-09-15 09:41:22 類型:vue
字號:    

  最近在項目開發(fā)中,遇到下面這樣一個問題:

  在進行數(shù)據(jù)請求之前,每個請求需要攜帶token, 但是token 有有效期,token 失效后需要換取新的token并繼續(xù)請求。

  需求分析

  每個請求都需要攜帶 token ,所以我們可以使用 axios request 攔截器,在這里,我們給每個請求都加 token,這樣就可以節(jié)省每個請求再一次次的復(fù)制粘貼代碼。

  token 失效問題,當(dāng)我們token 失效,我們服務(wù)端會返回一個特定的錯誤表示,比如 token invalid,但是我們不能在每個請求之后去做刷新 token 的操作呀,所以這里我們就用 axios response 攔截器,我們統(tǒng)一處理所有請求成功之后響應(yīng)過來的數(shù)據(jù),然后對特殊數(shù)據(jù)進行處理,其他的正常分發(fā)

  功能實現(xiàn)

  分析完問題后,我們來實現(xiàn)功能

  安裝axios, 這里我們就不再贅述怎么安裝axios.

  在 main.js 注冊 axios

     

  在 request 攔截器實現(xiàn)

axios.interceptors.request.use(
 config => {
  config.baseURL = '/api/'
  config.withCredentials = true // 允許攜帶token ,這個是解決跨域產(chǎn)生的相關(guān)問題
  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 攔截器實現(xiàn)

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)
 }
)



1、請求攔截器

axios.interceptors.request.use(function (config) {
    // 在發(fā)送請求之前做些什么,例如加入token
    .......
    return config;
  }, function (error) {
    // 對請求錯誤做些什么
    return Promise.reject(error);
  });

2、響應(yīng)攔截器

axios.interceptors.response.use(function (response) {
    // 在接收響應(yīng)做些什么,例如跳轉(zhuǎn)到登錄頁
    ......
    return response;
  }, function (error) {
    // 對響應(yīng)錯誤做點什么
    return Promise.reject(error);
  });

3、移除攔截器

var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);


<