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 BASE64编码 window.atob(), window.btoa()
Mar 09 Javascript
JavaScript脚本性能的优化方法
Feb 02 Javascript
Dom加载让图片加载完再执行的脚本代码
May 15 Javascript
JavaScript常用全局属性与方法记录积累
Jul 03 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
Aug 15 Javascript
Node.js程序中的本地文件操作用法小结
Mar 06 Javascript
简单实现jquery焦点图
Dec 12 Javascript
前端 Vue.js 和 MVVM 详细介绍
Dec 29 Javascript
vue+iview 实现可编辑表格的示例代码
Oct 31 Javascript
微信小程序实现发送验证码按钮效果
Dec 20 Javascript
记一次用ts+vuecli4重构项目的实现
May 21 Javascript
Vue数组响应式操作及高阶函数使用代码详解
Aug 01 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
DEFER怎么用?
2006/07/01 Javascript
FireFox中textNode分片的问题
2007/04/10 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
Nodejs如何搭建Web服务器
2016/03/28 NodeJs
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
java关于string最常出现的面试题整理
2021/01/18 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
如何定义一个可复用的服务
2014/09/30 面试题
外语系毕业生找工作的求职信
2013/11/28 职场文书
安全生产管理合理化建议书
2014/03/12 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
员工表扬信怎么写
2015/05/05 职场文书
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
python+opencv实现目标跟踪过程
2022/06/21 Python