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国旗变换效果代码
Aug 13 Javascript
jquery ready函数、css函数及text()使用示例
Sep 27 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
Apr 22 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
May 18 Javascript
jQuery原生的动画效果
Jul 10 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
Apr 13 Javascript
如何检测JavaScript的各种类型
Jul 30 Javascript
js阻止移动端页面滚动的两种方法
Jan 25 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
May 28 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 Javascript
vue 实现微信浮标效果
Sep 01 Javascript
vue Element左侧无限级菜单实现
Jun 10 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 处理图片的类实现代码
2009/10/23 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
Python实现partial改变方法默认参数
2014/08/18 Python
python中base64加密解密方法实例分析
2015/05/16 Python
Python 含参构造函数实例详解
2017/05/25 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
Django异步任务线程池实现原理
2019/12/17 Python
Python安装OpenCV的示例代码
2020/03/05 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
华为c/c++笔试题
2016/01/25 面试题
领导检查欢迎词
2014/01/14 职场文书
铣工实训报告
2014/11/05 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
2016年感恩节活动总结大全
2016/04/01 职场文书