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 相关文章推荐
将jQuery应用于login页面的问题及解决
Oct 17 Javascript
JS操作图片(增,删,改) 例子
Apr 17 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
May 12 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
Jun 09 Javascript
JavaScript提高网站性能优化的建议(二)
Jul 24 Javascript
Bootstrap CSS组件之大屏幕展播
Dec 17 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
Angular.js中定时器循环的3种方法总结
Apr 27 Javascript
vue-resource拦截器设置头信息的实例
Oct 27 Javascript
Element-ui table中过滤条件变更表格内容的方法
Mar 02 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
Sep 14 Javascript
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 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
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
详解vue axios用post提交的数据格式
2018/08/07 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
python ChainMap的使用和说明详解
2019/06/11 Python
Python tkinter和exe打包的方法
2020/02/05 Python
python为什么会环境变量设置不成功
2020/06/23 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
为什么UNION ALL比UNION快
2016/03/17 面试题
个人求职信范文分享
2014/01/06 职场文书
办公室主任职责范本
2014/03/07 职场文书
十八大宣传标语
2014/10/09 职场文书
计划生育汇报材料
2014/12/26 职场文书
道歉短信大全
2015/05/12 职场文书
费用申请报告范文
2015/05/15 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle
排查Tomcat进程假死的问题
2022/05/06 Servers