vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码


Posted in Javascript onMay 19, 2020

有这样一个场景:如果你在登录之前输入了http://localhost:8080/oauth2-mgm-app/#/userManage,想进入userManage页面,但是由于没有登录,系统是不会让你进入这个页面,之后会被定向到login页面。但是在登录之后,认为你有这个权限了,就需要重新定向到userManage页面。大致流程图如图1所示:

vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码

图1 登录后跳转到未登录前指定页面流程图

在vue-route的官方文档里其实有给到过这个demo,官方文档链接在此:https://router.vuejs.org/zh/guide/advanced/meta.html。但是不是很符合我们的需求,于是稍加改动,先上代码,搭配流程图可能更容易理解:

router.beforeEach((to, from, next) => {
 var asideMenuConfig = sessionStorage.getItem("asideMenuConfig");
 // 验证当前路由所有的匹配中是否需要有登录验证的
 if (to.matched.some(record => record.meta.requiresAuth)) {
  // 这里可以将cookie里是否存有token作为验证是否登录的条件
  // 请根据自身业务需要修改
  // 本段代码根据是否有权限菜单作为是否登录依据
  if (asideMenuConfig) {
   //校验所跳路由是否在配置菜单中
   if (asideMenuConfig.indexOf(to.path) != -1 || to.path == "/index" || to.path == "/login") {
    if(sessionStorage.getItem('redirect')!=null){
     var redirect=sessionStorage.getItem('redirect');
     if(to.path == redirect){//解决next()无限循环
      next()
     }else{
      next({
       path: redirect
      });
     }
    }else{
     next();
    }
   } else {
    next({
     path: from.path
    })
   }
  } else {
   sessionStorage.setItem('redirect', to.fullPath);
   next({
    name: 'login'
   })
  }
 } else {
  next();
 }
})

系统以是否有权限菜单作为是否登录依据,此处的权限菜单(不同人有不同的权限,所显示的菜单也不一样)由后端送出,处理成自己想要的树结构(例如样例代码中的asideMenuConfig,如图2所示)之后保存下来,此为前提。还有一种就是利用token验证作为登录依据,根据自己的业务需要吧,此处不展开。

vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码

图2asideMenuConfig

首先要在route.js定义路由(代码为节选):在路由元信息(meta字段)中添加一个对象,里面包含:requiresAuth(是否需要权限),title(子菜单名),parent(所属菜单名)

{
   path: '/RoleManage',
   name: 'RoleManage',
   component: () => import("@/pages/UserManage/roleManage"),
   meta: {
     requiresAuth: true,
     title: '角色管理',
     parent:"用户管理"
   }
},

然后我们需要遍历$rout.matched来检查路由记录中的meta字段,这些在官方文档中已经写的很清楚了,这里就不细细张开了。这里重点看下some() 方法,some()测试数组中的某些元素是否通过了指定函数的测试。

to.matched.some(record =>record.meta.requiresAuth)表示的是只要有一个页面的meta里的requiresAuth为true,即需要权限,则to.matched.some()返回true。

最后还有一处代码需要注意的是:

vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码

有人是不是就想了,获取了登陆前保存的页面路径就可以直接跳转到目标页面了,即写成下列这种形式,但是此举会导致页面一直无限循环调用导航守卫。

if(sessionStorage.getItem('redirect')!=null){
  var redirect=sessionStorage.getItem('redirect');
  next({
    path: redirect
  });
}else{
  next();
}

原因是一定要调用next()来resolve这个导航守卫钩子,但是next()有参数和无参数是不一样的,执行效果依赖next()的调用参数。

next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是confirmed(确认的)。

next()或者next({path:'/'})跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向next传递任意位置对象,且允许设置诸如repace:true、name:'home'之类的选项以及任何用在route-link的to prop或router.push中的选项。

注意:确保要调用next(),否则钩子就不会被 resolved。

总结

到此这篇关于vue利用全局导航守卫作登录后跳转到未登录前指定页面的文章就介绍到这了,更多相关vue利用全局导航守卫作登录后跳转到未登录前指定页面内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
深入理解JavaScript系列(3) 全面解析Module模式
Jan 15 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
Dec 17 Javascript
解析JSON对象与字符串之间的相互转换
Dec 18 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
Apr 12 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
纯css实现窗户玻璃雨滴逼真效果
Aug 23 Javascript
JS实现自动变换的菜单效果代码
Sep 09 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
Jan 23 Javascript
javascript 开发之网页兼容各种浏览器
Sep 28 Javascript
JS函数节流和防抖之间的区分和实现详解
Jan 11 Javascript
jQuery实现的五星点评功能【案例】
Feb 18 jQuery
jQuery实现容器间的元素拖拽功能
Dec 01 jQuery
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
May 19 #jQuery
JS加载解析Markdown文档过程详解
May 19 #Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
May 19 #Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
May 19 #jQuery
jQuery AJAX应用实例总结
May 19 #jQuery
单线程JavaScript实现异步过程详解
May 19 #Javascript
vue相关配置文件详解及多环境配置详细步骤
May 19 #Javascript
You might like
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
PHP之数组学习
2011/05/29 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
数据库测试通常都包括哪些方面
2015/11/30 面试题
研究生自荐信
2013/10/09 职场文书
日化店促销方案
2014/03/26 职场文书
党员志愿者活动总结
2014/06/26 职场文书
商务经理岗位职责
2014/08/03 职场文书
励志演讲稿500字
2014/08/21 职场文书
考察邀请函范文
2015/01/31 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
关于MySQL中的 like操作符详情
2021/11/17 MySQL