vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)


Posted in Javascript onOctober 24, 2018

一、路由拦截

登录拦截逻辑

第一步:路由拦截

首先在定义路由的时候就需要多添加一个自定义字段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();
  }
})

每个钩子方法接收三个参数:

* to: Route: 即将要进入的目标 路由对象
* from: Route: 当前导航正要离开的路由
* next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
* next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
* next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
* next(‘/') 或者 next({ path: ‘/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。

确保要调用 next 方法,否则钩子就不会被 resolved。

完整的方法见/src/router.js

其中,to.meta中是我们自定义的数据,其中就包括我们刚刚定义的requireAuth字段。通过这个字段来判断该路由是否需要登录权限。需要的话,同时当前应用不存在token,则跳转到登录页面,进行登录。登录成功后跳转到目标路由。

登录拦截到这里就结束了吗?并没有。这种方式只是简单的前端路由控制,并不能真正阻止用户访问需要登录权限的路由。还有一种情况便是:当前token失效了,但是token依然保存在本地。这时候你去访问需要登录权限的路由时,实际上应该让用户重新登录。

这时候就需要结合 http 拦截器 + 后端接口返回的http 状态码来判断。

第二步:拦截器

要想统一处理所有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拦截

拦截器

首先我们要明白设置拦截器的目的是什么,当我们需要统一处理http请求和响应时我们通过设置拦截器处理方便很多.

这个项目我引入了element ui框架,所以我是结合element中loading和message组件来处理的.我们可以单独建立一个http的js文件处理axios,再到main.js中引入.

/**
 * 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请求和响应的拦截.当然我们可以根据具体的业务要求更改拦截中的处理.

vue2+element更全面,更简单深入的例子 请查看:https://github.com/guo11111/vue2-demo

总结

以上所述是小编给大家介绍的vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
打造基于jQuery的高性能TreeView(asp.net)
Feb 23 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
Nov 07 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
Sep 19 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 Javascript
jquery在vue脚手架中的使用方式示例
Aug 29 jQuery
iview table render集成switch开关的实例
Mar 14 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
Apr 24 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
Sep 21 Javascript
基于JavaScript伪随机正态分布代码实例
Nov 07 Javascript
微信小程序后端无法保持session的原因及解决办法问题
Mar 20 Javascript
微信小程序图片右边加两行文字的代码
Apr 23 Javascript
Vue中函数防抖节流的理解及应用实现
Apr 24 Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 24 #Javascript
深入理解JavaScript的值传递和引用传递
Oct 24 #Javascript
详解JavaScript中typeof与instanceof用法
Oct 24 #Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
Oct 24 #Javascript
JavaScript根据json生成html表格的示例代码
Oct 24 #Javascript
vue项目引入Iconfont图标库的教程图解
Oct 24 #Javascript
vue中的router-view组件的使用教程
Oct 23 #Javascript
You might like
PHP输入输出流学习笔记
2015/05/12 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
PHP实现简易计算器功能
2020/08/28 PHP
jquery异步跨域访问代码
2013/06/28 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
JS实现滑动插件
2020/01/15 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
python3抓取中文网页的方法
2015/07/28 Python
python实现神经网络感知器算法
2017/12/20 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
python 检测图片是否有马赛克
2020/12/01 Python
java关于string最常出现的面试题整理
2021/01/18 Python
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
英文推荐信格式范文
2014/05/09 职场文书
单位租房协议书范本
2014/12/04 职场文书
学习与创新自我评价
2015/03/09 职场文书
留学推荐信英文范文
2015/03/26 职场文书
MySQL GRANT用户授权的实现
2021/06/18 MySQL
HttpClient实现表单提交上传文件
2022/08/14 Java/Android