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学习笔记5 类和对象
Jan 11 Javascript
js切换div css注意的细节
Dec 10 Javascript
JQuery获取各种宽度、高度(format函数)实例
Mar 04 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
Feb 22 Javascript
jQuery插件实现无缝滚动特效
Nov 24 Javascript
AngularJS国际化详解及示例代码
Aug 18 Javascript
jquery判断页面网址是否有效的两种方法
Dec 11 Javascript
Bootstrap源码解读导航条(7)
Dec 23 Javascript
Vue学习之路之登录注册实例代码
Jul 06 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
Nov 27 Javascript
vue配置nprogress实现页面顶部进度条
Sep 21 Javascript
微信小程序入门之指南针
Oct 22 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
用IE远程创建Mysql数据库的简易程序
2006/10/09 PHP
php 表单数据的获取代码
2009/03/10 PHP
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
canvas绘制多边形
2017/02/24 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
深入解读Python解析XML的几种方式
2016/02/16 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
python设置环境变量的作用和实例
2019/07/09 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
python中什么是面向对象
2020/06/11 Python
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
旷课检讨书3000字
2014/02/04 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
质量保证书
2015/01/17 职场文书
运动会通讯稿200字
2015/07/20 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
公开致歉信
2019/06/24 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
python使用glob检索文件的操作
2021/05/20 Python
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers
MySQL数据管理操作示例讲解
2022/12/24 MySQL