vau-cli 攔截器

設置攔截器,統一加載請求頭token,可以寫一個api統一請求

import axios from 'axios'
import store from '../store'
import router from '../router'

//設置全局axios默認值
axios.defaults.timeout = 5000; //5000的超時驗證
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';

//創建一個axios實例
const instance = axios.create();
instance.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';

axios.interceptors.request.use = instance.interceptors.request.use;

//request攔截器
instance.interceptors.request.use(
    config => {
        //每次發送請求之前檢測都vuex存有token,那麼都要放在請求頭髮送給服務器
        if (store.state.token) {
            config.headers.Authorization = `${store.state.token}`;
        }
        return config;
    },
    err => {
        return Promise.reject(err);
    }
);
//respone攔截器
instance.interceptors.response.use(
    response => {
        return response;
    },
    error => { //默認除了2XX之外的都是錯誤的,就會走這裏
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    store.dispatch('UserLogout'); //可能是token過期,清除它
                    router.replace({ //跳轉到登錄頁面
                        path: 'login',
                        query: {
                            redirect: router.currentRoute.fullPath
                        } // 將跳轉的路由path作爲參數,登錄成功後跳轉到該路由
                    });
            }
        }
        return Promise.reject(error.response);
    }
);

export default instance;

放在router=>index.js中

//註冊全局鉤子用來攔截導航
router.beforeEach((to, from, next) => {
  //獲取store裏面的token
  let token = store.state.token;
  //判斷要去的路由有沒有requiresAuth
  if (to.meta.requiresAuth) {

    if (token) {
      next();
    } else {
      next({
        path: '/login',
        query: {
          redirect: to.fullPath
        } // 將剛剛要去的路由path(卻無權限)作爲參數,方便登錄成功後直接跳轉到該路由
      });
    }

  } else {
    next(); //如果無需token,那麼隨它去吧
  }
});

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章