zoukankan      html  css  js  c++  java
  • vue+axios 前端实现的常用拦截

    一、路由拦截使用

    首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录。如果用户已经登录,则顺利进入路由,否则就进入登录页面,路由配置如下:

    const routes = [
        {
            path: '/',
            name: '/',
            component: Index
        },
        {
            path: '/repository',
            name: 'repository',
            meta: {
                requireAuth: true,  // 添加该字段,表示进入这个路由是需要登录的
            },
            component: Repository
        },
        {
            path: '/login',
            name: 'login',
            component: Login
        }
    ];

    定义完路由后,我们主要是利用vue-router提供的钩子函数beforeEach()对路由进行判断:

    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请求和响应,就得用上 axios 的拦截器。通过配置http response inteceptor,当后端接口返回401 Unauthorized(未授权),让用户重新登录。

    // http request 拦截器
    axios.interceptors.request.use(
        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配置
     */
    // 引入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

     如果你是使用了vux,那么在main.js这样使用:

    Vue.prototype.$http.interceptors.response.use()

     参考地址:vue中axios解决跨域问题和拦截器使用

  • 相关阅读:
    [大山中学模拟赛] 2016.9.17
    [DP优化方法之斜率DP]
    Gengxin讲STL系列——String
    小班讲课之动态规划基础背包问题
    ubuntu安装体验
    小班出题之字符串基础检测
    G
    B
    小项目--反eclass
    树--天平问题
  • 原文地址:https://www.cnblogs.com/moqiutao/p/9283574.html
Copyright © 2011-2022 走看看