vue中使用router全局守卫实现页面拦截的示例


Posted in Javascript onOctober 23, 2020

一、背景

在vue项目中使用vue-router做页面跳转时,路由的方式有两种,一种是静态路由,另一种是动态路由。而要实现对路由的控制需要使用vuex和router全局守卫进行判断拦截(安全问题文章最后讨论)

二、使用场景

静态路由的使用场景:在我们使用静态路由实现页面跳转时,不管我们是否登录,当我们在地址栏修改地址后,页面会发生跳转并展示页面内容(数据并不会被展示出来),这样的问题显然是不能够被接受的;

动态路由的使用场景:动态路由无非就是从后端拿到了数据然后在加到router里面了。假如用户登录了,在地址栏修改地址便能直接访问。所以动态路由并不能起到拦截作用。

三、解决方案

使用vuex+router.beforeEach()+动态路由实现页面拦截

页面刷新时会清楚vuex里面的值;(防止直接修改地址栏)

router.beforeEach()对跳转前进行拦截判断;(对vuex里面的值进行判断)

当用户登录时请求后台拿到数据,加载路由.(跳转页面)

四、实现过程

1.首先定义vuex里面的值,需要定义两个值:

a.登录状态信息的值 loginInfo 

b.存储动态路由的值 routerList

vue中使用router全局守卫实现页面拦截的示例

2.router.beforeEach()对路由跳转前进行控制 

//全局守卫
router.beforeEach((to, from, next)=> {
 let userId = store.state.loginInfo.id;
 //这里是对登录后的值进行判断,也可对token的值进行判断
 if (userId === '') {
  if (to.meta.requireAuth || to.name == null) {
  next({path: '/'})
  } else {
  next();
  }
 } else {
  //初始化动态路由方法
  initRouter(router, store); 
  next();
 }
 }
);

3.初始化动态路由

在全局守卫对应条件下加载动态路由数据routerList和在登录成功时存储登录成功的信息loginInfo 

新建一个xxx.js文件 引入axios 创建一个函数并使用export 暴露该方法;

请求成功拿到数据后,把数据造成和routes里的数据一样。然后使用 router.addRoutes 添加进去;

index中的默认路由

vue中使用router全局守卫实现页面拦截的示例

import axios from 'axios'
export const initRouter = (router,store)=>{
 if (store.state.routerList.length > 0) {
 return;
 }
 axios.get(' URL')
  .then((rest)=>{
  let routerList = [];
  if(rest.data.success){
  let routers = rest.data.body;
  routers.forEach(router=>{
   let {
    path,
    component,
    name,
   } = router
   let routerObj = {
    path:path,
    name:name,
    component(resolve){
    if (component.startsWith("index")) {
     require(['../components/' + component + '.vue'], resolve)
    }  
    
    },
    meta:{requireAuth:true} //是否是登录权限控制
   };
   routerList.push(routerObj);
   });
  //add到router中
  router.addRoutes(routerList); 
  //存储到vuex中
  store.commit('routerList', routerList); 

  }else{
   console.log(rest.data.error);
  }
 }).catch((error)=>{
  console.log(error);
 })
}

4.登录成功后存储成功状态信息并跳转页面

vue中使用router全局守卫实现页面拦截的示例

 至此,页面拦截功能已实现。

五、总结

该方法实现主要用到了:

1.vuex及页面刷新时会对vuex进行清空,所以比如退出时要对页面window.location.reload(),其它地方类似。

2.router.beforeEach()钩子函数及关键的router.addRoutes方法

3.es6的一些写法

以上就是vue中使用router全局守卫实现页面拦截的示例的详细内容,更多关于vue 页面拦截的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript中用星号表示预录入内容的实现代码
Jan 08 Javascript
javascript实现日历控件(年月日关闭按钮)
Dec 12 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
Jun 24 Javascript
JavaScript不刷新实现浏览器的前进后退功能
Nov 05 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
Apr 15 Javascript
js实现横向拖拽导航条功能
Feb 17 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
Feb 22 Javascript
教你如何用node连接redis的示例代码
Jul 12 Javascript
javascript动态创建对象的属性详解
Nov 07 Javascript
JS实现提示效果弹出及延迟隐藏的功能
Aug 26 Javascript
详解Vue的sync修饰符
May 15 Vue.js
教你部署vue项目到docker
Apr 05 Vue.js
vue使用video插件vue-video-player详解
Oct 23 #Javascript
vue-video-player视频播放器使用配置详解
Oct 23 #Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
Oct 23 #Javascript
Vue toFixed保留两位小数的3种方式
Oct 23 #Javascript
vuejs实现下拉框菜单选择
Oct 23 #Javascript
vue 如何使用递归组件
Oct 23 #Javascript
vue 如何从单页应用改造成多页应用
Oct 23 #Javascript
You might like
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
PHP设计模式之观察者模式实例
2016/02/22 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
vue中导出Excel表格的实现代码
2018/10/18 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
Python 正则表达式的高级用法
2016/12/04 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
Python处理CSV与List的转换方法
2018/04/19 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
python遍历小写英文字母的方法
2019/01/02 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
外贸实习生自荐信范文
2013/11/24 职场文书
高职教师岗位职责
2013/12/24 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
通用员工手册范本
2015/05/14 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
Python之matplotlib绘制折线图
2022/04/13 Python