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入门教程(1) 什么是JS
Jan 31 Javascript
JavaScript 事件系统
Jul 22 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
Aug 30 Javascript
javascript常用的方法分享
Jul 01 Javascript
javascript 显示全局变量与隐式全局变量的区别
Feb 09 Javascript
利用jQuery实现一个简单的表格上下翻页效果
Mar 14 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
May 27 Javascript
JS遍历DOM文档树的方法实例详解
Apr 03 Javascript
vue mounted组件的使用
Jun 18 Javascript
vue单应用在ios系统中实现微信分享功能操作
Sep 07 Javascript
vue-cli 关闭热更新操作
Sep 18 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
mysql5写入和读出乱码解决
2006/11/25 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
JavaScript 提升运行速度之循环篇 译文
2009/08/15 Javascript
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
python中循环语句while用法实例
2015/05/16 Python
python和bash统计CPU利用率的方法
2015/07/10 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
Sanic框架Cookies操作示例
2018/07/17 Python
python如何统计代码运行的时长
2019/07/24 Python
Python 画出来六维图
2019/07/26 Python
python 实现dict转json并保存文件
2019/12/05 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
Python实现手绘图效果实例分享
2020/07/22 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
水利学院求职自荐书
2014/02/01 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
销售主管竞聘书
2014/03/31 职场文书
感情真挚的毕业生求职信
2014/07/19 职场文书
css3 文字断裂效果
2022/04/22 HTML / CSS
Spring Boot实现文件上传下载
2022/08/14 Java/Android