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 相关文章推荐
基于jquery的仿百度搜索框效果代码
Apr 11 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
Jan 13 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
Sep 03 Javascript
javascript伸缩菜单栏实现代码分享
Nov 12 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
Mar 15 Javascript
layui select动态添加option的实例
Mar 07 Javascript
jQuery创建及操作xml格式数据示例
May 26 jQuery
小程序实现新用户判断并跳转激活的方法
May 20 Javascript
javascript事件循环event loop的简单模型解释与应用分析
Mar 14 Javascript
谈谈JavaScript令人迷惑的==与+
Aug 31 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 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下使用curl模拟用户登陆的代码
2010/09/10 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
js对象的比较
2011/02/26 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
python实现simhash算法实例
2014/04/25 Python
在Python中定义和使用抽象类的方法
2016/06/30 Python
python实现解数独程序代码
2017/04/12 Python
用Python设计一个经典小游戏
2017/05/15 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
什么是python的函数体
2020/06/19 Python
Python识别验证码的实现示例
2020/09/30 Python
机电一体化大学生求职信
2013/11/08 职场文书
法务专员岗位职责
2014/01/02 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
争先创优公开承诺书
2014/08/30 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL