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 相关文章推荐
关于document.cookie的使用javascript
Apr 11 Javascript
jquery animate图片模向滑动示例代码
Jan 26 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
Dec 08 Javascript
jQuery操作checkbox选择(list/table)
Apr 07 Javascript
纯javascript实现图片延时加载方法
Aug 21 Javascript
详解Javascript数据类型的转换规则
Dec 12 Javascript
js生成随机颜色方法代码分享(三种)
Dec 29 Javascript
gulp解决跨域的配置文件问题
Jun 08 Javascript
解决vue中el-tab-pane切换的问题
Jul 19 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
Jul 21 Javascript
ant design vue datepicker日期选择器中文化操作
Oct 28 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
php变量作用域的深入解析
2013/06/03 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
JS实现前端缓存的方法
2017/09/21 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
Python教程之全局变量用法
2016/06/27 Python
Python迭代和迭代器详解
2016/11/10 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
python 实现多维数组转向量
2019/11/30 Python
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
专科毕业生就业推荐信
2013/11/01 职场文书
办公室前台的岗位职责
2013/12/20 职场文书
保护地球的标语
2014/06/17 职场文书
反腐倡廉标语
2014/06/24 职场文书
监理中标通知书
2015/04/16 职场文书
道歉的话怎么说
2015/05/12 职场文书
担保书范文
2019/07/09 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers