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
原文地址:https://www.cnblogs.com/QQPrincekin/p/10582176.html