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 相关文章推荐
根据分辩率调用不同的CSS.
Jan 08 Javascript
初学js插入节点appendChild insertBefore使用方法
Jul 04 Javascript
jQuery 设置 CSS 属性示例介绍
Jan 16 Javascript
用js通过url传参把数据从一个页面传到另一个页面
Sep 01 Javascript
node.js中的http.response.removeHeader方法使用说明
Dec 14 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
Jan 23 Javascript
JS判断字符串变量是否含有某个字串的实现方法
Jun 03 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
Aug 23 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
Sep 30 Javascript
说说如何在Vue.js中实现数字输入组件的方法
Jan 08 Javascript
JS隐藏号码中间4位代码实例
Apr 09 Javascript
Vue深入理解插槽slot的使用
Aug 05 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
解析yii数据库的增删查改
2013/06/20 PHP
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
JS功能代码集锦
2016/05/04 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
2018/01/03 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
Python的形参和实参使用方式
2019/12/24 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
浙大网新C/C++面试解惑
2015/05/27 面试题
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
大学生的网络创业计划书
2013/12/26 职场文书
致铅球运动员广播稿精选
2014/01/12 职场文书
建筑设计专业求职自我评价
2014/03/02 职场文书
留学经费担保书
2014/05/12 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
物业保安辞职信
2015/05/12 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
vue 给数组添加新对象并赋值
2022/04/20 Vue.js