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代码
Dec 01 Javascript
js left,right,mid函数
Jun 10 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
Dec 13 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
JS修改iframe页面背景颜色的方法
Apr 01 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
May 03 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
Jan 09 Javascript
js下拉菜单生成器dropMenu使用方法详解
Aug 01 Javascript
js模拟百度模糊搜索的实例
Aug 04 Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 Javascript
Node登录权限验证token验证实现的方法示例
May 25 Javascript
vue切换菜单取消未完成接口请求的案例
Nov 13 Javascript
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
PHP中实现进程间通讯
2006/10/09 PHP
php结合飞信 免费天气预报短信
2009/05/07 PHP
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
理解javascript正则表达式
2016/03/08 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
使用typescript构建Vue应用的实现
2019/08/26 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
Python中的闭包实例详解
2014/08/29 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
python实现简单的学生管理系统
2021/02/22 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
慰问信模板
2015/02/14 职场文书
结婚典礼主持词
2015/06/29 职场文书
Redis安装使用RedisJSON模块的方法
2022/03/23 Redis
Java界面编程实现界面跳转
2022/06/16 Java/Android