热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

return语句竟然跳不出for循环?怎么肥事?

松哥最近正在录制TienChin项目视频~采用SpringBoot+Vue3技术栈,里边会涉及到各种好玩

松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。


今天和小伙伴们聊一个简单的话题,是有一个小伙伴在星球上提的问题,问题不难,但是不熟悉的小伙伴可能会出错,所以简单说一下。

先来看看这个小伙伴是怎么提问的:

老实说,有时候我真的会被小伙伴们的提问感动到! 这年头能把问题这么详细列出来的人真的不多了。松哥微信每天也有不少小伙伴在提问,有的问题就一句话,看了也不知道想问啥,那我也没法回复,我就不贴图了,免得有小伙伴对号入座。

总之这个小伙伴这个提问特别好,我看完文字看完图之后,基本上就已经知道发生什么事了。

他出问题的代码在这里:

这个问题其实这块就是 vhr 中的动态权限问题,小伙伴们知道,vhr 的权限可以动态设置,也就是我们可以通过修改数据库中的表,来动态调整每一个接口需要什么样的权限,vhr 里相关代码主要涉及到三个类:

  • https://github.com/lenve/vhr/blob/master/vhr/vhrserver/vhr-web/src/main/java/org/javaboy/vhr/config/CustomFilterInvocationSecurityMetadataSource.java
  • https://github.com/lenve/vhr/blob/master/vhr/vhrserver/vhr-web/src/main/java/org/javaboy/vhr/config/CustomUrlDecisionManager.java
  • https://github.com/lenve/vhr/blob/master/vhr/vhrserver/vhr-web/src/main/java/org/javaboy/vhr/config/SecurityConfig.java

这三个类的实现细节在 vhr 中都有详细的介绍,这里我就不细说了。这里就简单说说每个类的作用:

  • CustomFilterInvocationSecurityMetadataSource:这个是自定义的获取元数据的类,作用是根据请求的 URL 地址,分析出这个请求所需要的角色。
  • CustomUrlDecisionManager:这是一个决策器,按理说决策器需要配合投票器一起来使用,但是我这里简化了步骤,直接在决策器中做了判断,就没用投票器了,决策器在执行过程中如果抛出了异常,那么就是权限不足,如果决策器能够正常执行不抛出任何异常,那么就说明权限没问题。
  • SecurityConfig:这就是 Spring Security 的配置类,在这个配置类中可以通过对象后置处理器 ObjectPostProcessor 来动态修改一个 Bean,上面两个对象就是通过 ObjectPostProcessor 添加到相应实例中的。

那么这个小伙伴出问题的类就是决策器,我们再来看看他这一张图片:

decide 方法就是决策方法,这个方法第一个参数 Authentication 参数重保存了当前用户的信息,包括当前用户的角色啥的;第三个参数是一个集合,里边是当前请求需要的角色信息。

现在就在 decide 方法中做比对,如果当前用户具备当前请求所需要的角色,那么就没问题,如果当前用户不具备当前请求所需要的角色,那么就抛出异常。

仔细看你发现他这个逻辑也没啥问题,而且看下面的日志也打印出来了,说明 if 分支也进去了,所以问题就出在了这个 return 上面。

小伙伴们看这里的 return 在 forEach 中,而不是我们常见的 for 循环中,那么这歌 forEach 和 for 有啥不同呢?

这个 forEach 是 lambda 表达式相关的内容,forEach 的参数是一个消费者,也就是消费一个数据,类似下面这样:

List list = new ArrayList<>();
list.forEach(new Consumer() {
    @Override
    public void accept(String s) {
        
    }
});

那么你想一下,accept 方法中出现一个 return,那么仅仅只能终止当前方法的执行,并不影响循环整体的执行,即并不能提前终止循环。

现在就真相大白了,如果匹配到权限是满足的,提前终止的 return 语句没生效,方法最后一句异常还是会抛出来。

所以改成这样就行啦:

好啦,最后再盲猜一下为什么这个小伙伴会出现这个错误。在 vhr 视频中,我是前后端都手把手教大家写的,视频也会写前端代码,前端有一个 forEach,就是真正的 for 循环,而且前端的箭头函数跟后端的 Lambda 也挺像的,估计小伙伴可能看到前端的,以为后端也能这么用(纯瞎猜~。


松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。




推荐阅读
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
author-avatar
huineisuan111184
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有