博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue+axios 实现http拦截及路由拦截
阅读量:6259 次
发布时间:2019-06-22

本文共 5040 字,大约阅读时间需要 16 分钟。

hot3.png

axios http拦截

http.js配置

/** * Created by superman on 17/2/16. * http配置 */import axios from 'axios'import { Loading, Message } from 'element-ui'import store from './store/store.js'import * as types from './store/types.js'import router from './index.js'import config from './config.js'// axios 配置 config.js//axios.defaults.timeout = 5000;//axios.defaults.baseURL = 'https://api.github.com';//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';// http request 拦截器axios.interceptors.request.use(    config => {        if ($.cookie("token")) {            config.headers._token = $.cookie("token");        }		        return config;    },    err => {        return Promise.reject(err);    });// http response 拦截器axios.interceptors.response.use(    response => {        if (response.data.code == 2) {            window.location.href = "/#/login";            $.cookie("user", null);            $.cookie("token", null);            return "";        } else {            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}                    })            }        }        // console.log(JSON.stringify(error));//console : Error: Request failed with status code 402        return Promise.reject(error.response.data)    });export default axios;

路由的index.js配置

页面刷新时,重新赋值tokenif ($.cookie('token')) {    store.commit(types.LOGIN, $.cookie('token'))}

main.js配置

import Vue from 'vue'import axios from './router/http' //引入配置的http文件import vuex_store from './router/store/store'import App from './App'import router from './router/index.js'import VeeValidate from 'vee-validate'import share from '../static/js/jquery.share.min.js'import Vuex from 'vuex';import Paginate from 'vuejs-paginate'

vuex的store.js文件

import Vue from 'vue'import Vuex from 'vuex';import * as types from './types'Vue.use(Vuex);//storeconst vuex_store = new Vuex.Store({    state: {        loginShow: false,        registerShow: false,        forgetPwd: false,        surePwd: false,        findPwd: false,        goRegister: false, //点击注册        goLogin: false, //点击登录        dataRecord: false,        goodsRecord: false, //生成企业 && 集团        wxRecord: false, //维修企业        user: {},        token: $.cookie("token"),        title: '',        zscxVal: "1212",        logicTit: "",        logicTit2: "",        dataInfo: [],        saleType: null,        logincomponent: false,    },    mutations: {        [types.LOGIN]: (state, data) => {            $.cookie('token', data, { path: '/' });            //localStorage.token = data;            state.token = data;        },        [types.LOGOUT]: (state) => {            //localStorage.removeItem('token');            $.cookie('token', null);            state.token = null        },        [types.TITLE]: (state, data) => {            state.title = data;        },        outputType: function(state, obj) {            if (obj.num == 1) {                state.saleType = "销售出库";            } else {                state.saleType = "其他出库";            }        }    }})export default vuex_store;

type.js是定义常量mutation的名称

/** * Created by superman on 17/2/16. * vuex types */export const LOGIN = 'login';export const LOGOUT = 'logout';export const TITLE = 'title'

路由拦截

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

在Vue2.0中的路由钩子主要是用来拦截导航,让它完成跳转或前取消,可以理解为路由守卫。

分为全局导航钩子,单个路由独享的钩子,组件内钩子。 三种 类型的钩子只是用的地方不一样,都接受一个函数作为参数,函数传入三个参数,分别为to,from,next。

其中next有三个方法

(1)next(); //默认路由

(2)next(false); //阻止路由跳转

(3)next({path:’/’}); //阻止默认路由,跳转到指定路径

import Vue from 'vue'import Router from 'vue-router'Vue.use(Router)const router = new Router({  routes: [    {      path: '/',      /*      *  按需加载       */      component: (resolve) => {        require(['../components/Home'], resolve)      }    }, {      path: '/record',      name: 'record',      component: (resolve) => {        require(['../components/Record'], resolve)      }    }, {      path: '/Register',      name: 'Register',      component: (resolve) => {        require(['../components/Register'], resolve)      }    }, {      path: '/Luck',      name: 'Luck',         // 需要登录才能进入的页面可以增加一个meta属性      meta: {         requireAuth: true      },      component: (resolve) => {        require(['../components/luck28/Luck'], resolve)      }    }  ]})//  判断是否需要登录权限 以及是否登录router.beforeEach((to, from, next) => {    store.commit('router', to.path.split("/")[1]);    if (to.matched.some(res => res.meta.requireAuth)) { // 判断是否需要登录权限        if (localStorage.getItem('ms_username')) {// 判断是否登录            next()        } else {// 没登录则跳转到登录界面          next({            path: '/Register'          })        }    } else {        next()    }})export default router

转载于:https://my.oschina.net/lixiaoyan/blog/1510477

你可能感兴趣的文章
pgpgin|pgpgout|pswpin|pswpout意义与差异
查看>>
全排列(递归与非递归实现)
查看>>
[转] C/C++中printf和C++中cout的输出格式
查看>>
swift 如何实现点击view后显示灰色背景
查看>>
【Android】3.9 覆盖物功能
查看>>
Plus One
查看>>
Git -- 创建版本库
查看>>
myeclipse 怎么安装与激活
查看>>
Atitit.异步编程的发展历史 1.1. TAP & async/await
查看>>
RTP timestamp与帧率及时钟频率的关系
查看>>
企业门户平台解决方案
查看>>
过滤器入门
查看>>
深入浅出讲解:php的socket通信
查看>>
Photoshop 批量处理图片
查看>>
浅谈C# 多态的魅力(虚方法,抽象,接口实现)
查看>>
jQuery--百度百科
查看>>
Unity3D 之2D动画机
查看>>
基础知识系列☞闲言
查看>>
蓝牙Ibeacon室内定位和微信摇一摇周边原理分析
查看>>
架构设计:负载均衡层设计方案(7)——LVS + Keepalived + Nginx安装及配置
查看>>