axios攔截http攔截


一,判斷登錄頁面

const routes = [
    {
        path: '/',
        name: '/',
        component: Index
    },
    {
        path: '/repository',
        name: 'repository',
        meta: {
            requireAuth: true,  // 添加該字段,表示進入這個路由是需要登錄的
        },
        component: Repository
    },
    {
        path: '/login',
        name: 'login',
        component: Login
    }
];

二,監聽路由

router.beforeEach((to, from, next) => {
    if (to.meta.requireAuth) {  // 判斷該路由是否需要登錄權限
        if (store.state.token) {  // 通過vuex state獲取當前的token是否存在
            next();
        }
        else {
            next({
                path: '/login',
                query: {redirect: to.fullPath}  // 將跳轉的路由path作為參數,登錄成功后跳轉到該路由
            })
        }
    }
    else {
        next();
    }
})

三,攔截器

// http request 攔截器
axios.interceptors.request.use(
    //在請求之前做點什么 比如加入token config
=> { if (store.state.token) { // 判斷是否存在token,如果存在的話,則每個http header都加上token config.headers.Authorization = `token ${store.state.token}`; } return config; }, err => { return Promise.reject(err); }); // http response 攔截器 axios.interceptors.response.use( response => { return response; }, error => { if (error.response) { switch (error.response.status) { case 401: // 返回 401 清除token信息並跳轉到登錄頁面 store.commit(types.LOGOUT); router.replace({ path: 'login', query: {redirect: router.currentRoute.fullPath} }) } } return Promise.reject(error.response.data) // 返回接口返回的錯誤信息 });

四,http攔截

/**
 * http配置
 */
// 引入axios以及element ui中的loading和message組件
import axios from 'axios'
import { Loading, Message } from 'element-ui'
// 超時時間
axios.defaults.timeout = 5000
// http請求攔截器
var loadinginstace
axios.interceptors.request.use(config => {
 // element ui Loading方法
 loadinginstace = Loading.service({ fullscreen: true })
 return config
}, error => {
 loadinginstace.close()
 Message.error({
 message: '加載超時'
 })
 return Promise.reject(error)
})
// http響應攔截器
axios.interceptors.response.use(data => {// 響應成功關閉loading
 loadinginstace.close()
 return data
}, error => {
 loadinginstace.close()
 Message.error({
 message: '加載失敗'
 })
 return Promise.reject(error)
})
 
export default axios

統一處理了http請求和響應的攔截.當然我們可以根據具體的業務要求更改攔截中的處理.

//請求攔截器 請求攔截器的作用是在請求發送前進行一些操作,例如在每個請求體里加上token,統一做了處理如果以后要改也非常容易。
axios.interceptors.request.use(function (config) {
    // 在發送請求之前做些什么,例如加入tokenreturn config;
  }, function (error) {
    // 對請求錯誤做些什么
    return Promise.reject(error);
  });

//響應攔截器 響應攔截器的作用是在接收到響應后進行一些操作,例如在服務器返回登錄狀態失效,需要重新登錄的時候,跳轉到登錄頁。
axios.interceptors.response.use(function (response) {
    // 在接收響應做些什么,例如跳轉到登錄頁
    ......
    return response;
  }, function (error) {
    // 對響應錯誤做點什么
    return Promise.reject(error);
  });

//移除攔截器 
var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
//為axios添加實例攔截器 var instance = axios.create(); instance.interceptors.request.use(function () {/*...*/});

 

自己項目中的請求攔截

 1 import Axios from 'axios'
 2 import { router } from '../router'
 3 import { baseURL } from '../config/config'
 4 import { getStorage } from '../assets/storage/index'
 5 
 6 function plugin (Vue) {
 7   if (plugin.installed) {
 8     return
 9   }
10   Axios.defaults.baseURL = baseURL()
11   Axios.defaults.timeout = 5000 * 2
12   // Axios.create({
13   //   baseURL: 'http://',
14   //   timeout: 5000 * 2
15   //   // withCredentials: true//不通過請求頭傳遞 攜帶cookie發送
16   // })
17   // 請求攔截
18   Axios.interceptors.request.use(config => {
19     if (config.method === 'post') {
20       config.data = JSON.stringify(config.data)
21     }
22     // 設置請求頭
23     config.headers['Content-type'] = 'application/json'
24     let token = getStorage('TokenKey')
25     if (token) {
26       config.headers['Authorization'] = 'bearer ' + token
27     }
28     return config
29   }, (err) => {
30     return Promise.reject(err)
31   })
32   // 請求結束
33   Axios.interceptors.response.use((res) => {
34     if (res.status === 200) {
35       return res.data
36     }
37   }, (err) => {
38     if (err.response) {
39       if (err.response.status === 401) {
40         router.replace('/lancher')
41           .then(() => {
42             Vue.toast.hide()
43             Vue.alert.hide()
44           })
45       }
46     }
47     return Promise.reject(err)
48   })
49 
50   Vue.req = (() => {
51     return Axios
52   }).call(this)
53 
54   Object.defineProperties(Vue.prototype, {
55     $req: {
56       get () {
57         return Axios
58       }
59     }
60   })
61 }
62 
63 if (typeof window !== 'undefined' && window.Vue) {
64   window.Vue.use(plugin)
65 }
66 
67 export default plugin

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM