springboot 拦截器之Advisor不生效问题

SPringBoot使用方法注解拦截器时遇到不生效问题记录:

  1. 定义方法注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DataScope
{boolean enable() default true;}
  1. 定义 Advisor

@Getter
@EqualsAndHashCode(callSuper = true)
@Component
public class DataPermissionAnnotationAdvisor extends AbstractPointcutAdvisor {private final Advice advice;private final Pointcut pointcut;public DataPermissionAnnotationAdvisor() {this.advice = new DataScopeAnnotationInterceptor();this.pointcut = this.buildPointcut();}protected Pointcut buildPointcut() {Pointcut classPointcut = new AnnotationMatchingPointcut(DataScope.class, true);Pointcut methodPointcut = new AnnotationMatchingPointcut(null, DataScope.class, true);return new ComposablePointcut(classPointcut).union(methodPointcut);}}
  1. 定义拦截器

public class DataScopeAnnotationInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {Logger log = LoggerFactory.getLogger(DataScopeAnnotationInterceptor.class);log.debug("DataScopeAnnotationInterceptor 拦截器:" + methodInvocation.getMethod().getName());try {// 执行逻辑return methodInvocation.proceed();} finally {// 出栈if (dataPermission != null) {DataPermissionContextHolder.remove();}}}}
  1. 在要使用拦截器的方法体上方添加注解
@Service
public class UserService {@DataScopepublic void method01() {// 查询订单UserDO user = userMapper.selectById(1);System.out.println(user);}}

完成以上全部代码,在调用motho01()方法时,正常就应该先执行拦截器,再执行method01中的方法。但在springboot-2.1.3RELEASE版本时,拦截器却没有生效。
网上搜罗一圈没有现成的办法,只能老老实实看源码了,功夫不负有心人,请看以下源码:

public class InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator {@Nullableprivate ConfigurableListableBeanFactory beanFactory;public InfrastructureAdvisorAutoProxyCreator() {}protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {super.initBeanFactory(beanFactory);this.beanFactory = beanFactory;}//在获取拦截器时,通过这个方法判断是否是有效拦截器的意思。
//其中 this.beanFactory.getBeanDefinition(beanName).getRole() == 2 这个条件就是导致拦截器不生效的小虫子。protected boolean isEligibleAdvisorBean(String beanName) {return this.beanFactory != null && this.beanFactory.containsBeanDefinition(beanName) && this.beanFactory.getBeanDefinition(beanName).getRole() == 2;}
}

解决办法:

  • 只需在DataPermissionAnnotationAdvisor 类上方添加Role(2)这个注解,拦截器就生效了。

像这样就可以了。

@Getter
@EqualsAndHashCode(callSuper = true)
@Component
@Role(2)
public class DataPermissionAnnotationAdvisor extends AbstractPointcutAdvisor {private final Advice advice;private final Pointcut pointcut;public DataPermissionAnnotationAdvisor() {this.advice = new DataScopeAnnotationInterceptor();this.pointcut = this.buildPointcut();}protected Pointcut buildPointcut() {Pointcut classPointcut = new AnnotationMatchingPointcut(DataScope.class, true);Pointcut methodPointcut = new AnnotationMatchingPointcut(null, DataScope.class, true);return new ComposablePointcut(classPointcut).union(methodPointcut);}}

@Role注解

  1. 标识Bean的类别
  2. 种类:
    1. ROLE_APPLICATION = 0
    • bean的默认角色
    • 标识应用的主要的主要角色
    • 通常对应于用户定义的bean
    1. ROLE_APPLICATION = 1
    • 标识较大配置的一部分
    • 通常是仔细观察特定的ComponentDefinition时重要的提示,而不是体现在应用中
    1. ROLE_INFRASTRUCTURE = 2
    • 标识后台角色,与最终用户无关
    • 通常供是内部工作的bean使用

通常用户定义的bean,role的值都是0,而springboot内核bean的role值才为2。所以我看到有自动配置插件中没有手动添加Role注解,依然能拦截,我想就是这个原因吧。

其他的办法,欢迎留言补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出现 java: 找不到符号 符号: 变量 log 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 增加编译参数3.2 增加lombok插件3.3 清楚本地缓存1. 问题所示 使用Springboot启动项目的时候,出现如下bug: java: 找不到符号符号: 变量 log位置: 类 org.springblade.example.consumer.rpc.BlogStu

如何定位线上OOM?

文章目录 造成OOM的原因1.一次性申请的太多2. 内存资源耗尽未释放3.本身资源不够 如何快速定位OOM?1.系统已经OOM了2.系统运行中还未OOM2.1导出dump文件:2.2.结合jvisualvm进行调试2.3 利用ArthasArthas可以做什么?如何使用Arthas小结 造成OO…

Docker常用命令总结

文章目录 Docker命令总结 Docker命令总结 简介:Docker是一个基于轻量级虚拟化技术的容器,整个项目基于Go语言开发,并采用了Apache 2.0协议。Docker可以将我们的应用程序打包封装到一个容器中,该容器包含了应用程序的代码、运行环…

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——(9.13.7-9.13.8)

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️创做不易,麻烦点个关注❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ ❤️❤️❤️❤️❤️❤️❤️❤️❤️文末有惊喜!献舞一支!❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目录 9.13…

Git篇---第九篇

系列文章目录 文章目录 系列文章目录前言一、使用过git merge和git rebase吗?它们之间有什么区别?二、使用过git cherry-pick,有什么作用?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看…

GPIO模拟MDIO

背景 CPU:AST2500 驱动里实现GPIO模拟MDIO驱动,参考内核驱动mdio-bitbang.c和mdio-gpio.c,当前项目不支持设备树,驱动需要改成platform注册 MDIO介绍 SMI接口 SMI是MAC内核访问PHY寄存器接口,它由两根线组成,双工…

旅游规划

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。 输入格式: …

c++ qt 窗口开发中 俩按钮组合 配合 显影 已解决

在日常项目中,有这么需求,还想窗口移动,还想 右侧关闭 还能tab栏点击显影的需求,不得使用 qt模拟点击事件 进行功能优化 特大杯 大杯 控制 窗口显影, 咖啡 按钮 显示窗口 可乐 豆浆 不显示窗口 四个按钮的 互斥关…

Amazon SageMaker机器学习之旅的助推器

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 一、前言 在当今的数字化时代,人工智能和机器学习已经…

Android Studio报Gradle问题解决思路

Gradle的版本号与Android studio版本、AGP(Android Gradle Plugin)版本、jdk版本都有关系。只有同时匹配三个版本号,才能使用对应的Gradle版本。 1、AGP的版本号与Android studio版本的关系。 Google 搜索 Android studio gradle plugin re…

2023一起益企广东省中小企业数字化赋能活动(深圳站)成功举办

12月12日,由广东工业和信息化厅指导,广东省中小企业服务中心、深圳市中小企业服务局主办,深圳联通承办的2023年“一起益企”广东省中小企业数字化赋能专项对接志愿服务活动(深圳站)在深圳成功举办。 本次活动涵盖中小企…

【AI底层逻辑】——“数学华尔兹”之一元线性回归

一元线性回归模型想必大家都耳熟能详,这里不再赘述。但在使用python中机器学习包时一定见过类似模型评价参数的输出,这一章我们就讲一讲回归分析里一些模型评价概念! 一、方差分析ANOVA 方差分析是一种用于确定线性回归模型中不同变量对目标…

【改进YOLOv8】车辆测距预警系统:融合空间和通道重建卷积SCConv改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义: 随着交通工具的普及和道路交通的不断增加,车辆安全问题日益凸显。特别是在高速公路等高速道路上,车辆之间的距离和速度差异较…

1036 跟奥巴马一起编程

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在…

【论文】 虚拟机 和 Linux容器 的 最新性能比较

虚拟机 和 Linux容器 的 最新性能比较 An Updated Performance Comparison of Virtual Machines and Linux Containers 借助DeepL辅助翻译 校准 摘要 云计算广泛使用虚拟机(VM),因为它们允许工作负载相互隔离,并在一定程度上控…

springboot框架的客制化键盘个性化商城网站

客制化键盘网站是从客制化键盘的各部分统计和分析,在过程中会产生大量的、各种各样的数据。本文以客制化键盘管理为目标,采用B/S模式,以Java为开发语言,Jsp为开发技术、idea Eclipse为开发工具,MySQL为数据管理平台&am…

西南科技大学数字电子技术实验七(4行串行累加器设计及FPGA实现)FPGA部分

一、实验目的 1、掌握基于Verilog语言的diamond工具设计全流程。 2、熟悉、应用Verilog HDL描述数字电路。 3、掌握Verilog HDL的组合和时序逻辑电路的设计方法。 4、掌握“小脚丫”开发板的使用方法。 二、实验原理 三、程序清单(每条语句必须包括注释或在开发…

Leetcode 491 递增子序列

题意理解: 输入:nums [4,6,7,7] 输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]] 这里不止要找一个子序列,还要元素保证其在原来的集合中的前后顺序,且应为增序。 为保证一个增序序列,…

刘家窑中医院王忠主任:心脑血管健康知识的传播者和实践者

为普及心脑血管健康知识,呼吁市民注重心脑血管健康,王忠主任及其科室医护人员举办进社区义诊咨询的活动。王忠主任及多名中医心脑专家和护理人员为社区居民免费进行量血压、测血糖以及健康咨询等义诊活动。 王忠主任用了全身的心血,学习百家吸…

LTC是什么意思?CRM怎样帮助这一流程的实现?

在现代商业环境下,将潜在客户转化成实际销售是公司成功的基石之一。而CRM管理系统是完成LTC的有效工具。本文将向您介绍LTC是什么?公司怎样企业如何通过CRM实现这一流程的? LTC(从线索到现金)是企业运营管理中的一个重…