zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    SSH框架整合-myeclipse
    查看mysql数据库文件存放位置
    Java反射及注解学习- 反射的使用
    线程join方法demo-模拟叫号看病
    线程同步案例
    线程死锁示例
    《广西壮族自治区食品药品监督管理局》代码
    复习点算法知识,水仙花数加冒泡排序,以及一道算法题
    词性标注 HMM
    kd树
  • 原文地址:https://www.cnblogs.com/QQPrincekin/p/10582176.html
Copyright © 2011-2022 走看看