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 相关文章推荐
js拖动div 当鼠标移动时整个div也相应的移动
Nov 21 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
javascript入门之window对象【新手必看】
Nov 22 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
Feb 20 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
Feb 28 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
Angularjs中ng-repeat的简单实例
Aug 25 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
May 02 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
Apr 30 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
May 17 jQuery
JS中一些高效的魔法运算符总结
May 06 Javascript
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
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
JavaScript学习笔记之数组去重
2016/03/23 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
python3爬取数据至mysql的方法
2018/06/26 Python
python pytest进阶之fixture详解
2019/06/27 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
django自定义模板标签过程解析
2019/12/14 Python
python求前n个阶乘的和实例
2020/04/02 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
出纳岗位职责范本
2013/12/01 职场文书
医院门卫岗位职责
2013/12/30 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
学生会主席竞聘书
2014/03/31 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
学校捐书活动总结
2015/05/08 职场文书
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python
修改并编译golang源码的操作步骤
2021/07/25 Golang
Redis过期数据是否会被立马删除
2022/07/23 Redis