spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构

spring aop 注释

下一篇文章将演示如何使用Spring AOP和注释编写简单的审计。 审核机制将是干净,高效且易于维护的(和Kewwl!)。

我将在用户管理系统上演示我的示例(假设您具有反射和AOP的一般知识)。

我们从简单的数据库表开始,以保​​存我们的审计数据:

`id`,`username``user_type``action``target_user``date``user_ip`

我们需要填充4个主要字段(用户名,用户类型,操作,目标用户)

*用户名–执行操作的用户

* TargetUser –执行操作的目标用户。

现在,让我们创建新的注释来标记我们的“想被审计”方法。 我们将非常“有创意”并使用:@AuditAble

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface Auditable {
AuditingActionType actionType();
}

带注释的@AuditAble方法示例:

@Override@Transactional@Auditable(actionType = AuditingActionType.INTERNAL_USER_REGISTRATION)public void createInternalUser(UserDTO userDTO) {userCreationService.createInternalUserOnDB(userDTO);}

我们未来的Aspect(aop)将使用DTO从方法参数中收集一些审核数据。 在我们的情况下,将收集目标用户名和actionType作为我们的审核信息。

为此,我创建了另一个注释AuditingTargetUsername

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface AuditingTargetUsername {
String value() default "";
}

因此,在UserDTO内部,我们得到了:

public abstract class UserDTO implements Serializable {@NotNull@AuditingTargetUsernameprivate String userName;...}

我们用@AuditingTargetUsername注释了userName。 该信息将在以后收集。

现在,让我们创建AOP的方面。 此处收集并执行所有审核逻辑(拦截@Auditable方法,从批注中提取信息,使用存储库保存最终审核记录):

@Aspect
public class AuditingAspect {....@After("@annotation(auditable)")@Transactionalpublic void logAuditActivity(JoinPoint jp, Auditable auditable) {String targetAuditingUser;String actionType = auditable.actionType().getDescription();String auditingUsername = Authentication auth = SecurityContextHolder.getContext().getAuthentication().getName()role = userService.getCurrentUser(false).getPermissionsList().toString();auditingUsernameIp = request.getRemoteAddr();}logger.info("Auditing information. auditingUsername=" + auditingUsername + ", actionType=" + actionType + ", role=" + role + ", targetAuditingUser="+ targetAuditingUser + " auditingUsernameIp=" + auditingUsernameIp);auditingRepository.save(new AuditingEntity(auditingUsername, role, actionType, targetAuditingUser, auditingUsernameIp,new Timestamp(new java.util.Date().getTime())));}

ill解释了主要的代码区域:

切入点–所有@ Auditable.annotations
建议–键入@After(在方法调用后我们要审核)

通过带注释的方法的声明检索ActionType值:

@Auditable( actionType = AuditingActionType.INTERNAL_USER_REGISTRATION

auditingUsername是执行操作的当前用户(在本例中为登录用户)。 我通过SecurityContext(Spring Security)检索到了它。

现在,我们将通过运行时的反射来提取@targetAuditingUser字段:

targetAuditingUser = extractTargetAuditingUser(jp.getArgs());
...public String extractTargetAuditingUserFromAnnotation(Object obj) {
...result = getTargetAuditingUserViaAnnotation(obj);...}

这就是通过反射提取带注释的字段的逻辑:

private String getTargetAuditingUserViaAnnotation(Object obj) {
class cl=obj.getClass()String result = null;try {for (Field f : cl.getDeclaredFields())for (Annotation a : f.getAnnotations()) {if (a.annotationType() == AuditingTargetUsername.class) {f.setAccessible(true);Field annotatedFieldName = cl.getDeclaredField(f.getName());annotatedFieldName.setAccessible(true);String annotatedFieldVal = (String) annotatedFieldName.get(obj);logger.debug("Found auditing annotation. type=" + a.annotationType() + " value=" + annotatedFieldVal.toString());result = annotatedFieldVal;}}} catch (Exception e) {logger.error("Error extracting auditing annotations from obj" + obj.getClass());}return result;}

DB上的结果:

审核1

而已。 我们拥有干净的审核基础结构,您所需要做的就是用@Auditable注释您的方法,并在DTO /实体内部注释所需的待审核信息。

伊丹

翻译自: https://www.javacodegeeks.com/2014/07/auditing-infrastructure-for-your-app-using-spring-aop-custom-annotations-and-reflection.html

spring aop 注释

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

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

相关文章

springboot 打包_springboot打包-体积太大怎么办

springcloud项目打包动辄100多兆,在文件上传部署的时候非常耗时,多数情况下是毫无意义的耗时,因为依赖包很多情况下不需要改变,只是修改了业务逻辑,那么每次打包上传的时间都浪费了,尤其在开发环境下&#…

.vue文件_Spring Boot 2.x(十六):玩转vue文件上传

为什么使用Vue-Simple-Uploader 最近用到了Vue Spring Boot来完成文件上传的操作,踩了一些坑,对比了一些Vue的组件,发现了一个很好用的组件——Vue-Simple-Uploader,先附上gayhub的,再说说为什么选用这个组件&#xf…

成为Java流专家–第2部分:中级操作

就像魔术棒一样,中间操作将一个Stream转换为另一个Stream。 这些操作可以无穷无尽的方式组合在一起,以可读有效的方式执行从简单到高度复杂的任务。 本文是五分之二,其中还有一个GitHub存储库,其中包含每个单元的说明和练习。 第…

HTML怎么在li中加select标签,自定义UL LI选择框似乎在其他HTML元素后面

我似乎无法弄清楚为什么我的自定义UL LI选择框出现在其他HTML元素后面。你如何解决这个问题,当用户点击选择框时,它会出现在其他页面元素的顶部?这里是手头的问题的一个画面: 下面是一个描绘所期望的结果: 这里是有问题…

java初学者面试_Java面试的前50个问题,面向初学者和经验丰富的程序员

java初学者面试您可以参加任何Java面试,无论是大四还是中级,经验或新来的人,一定会看到线​​程,并发和多线程中的几个问题。 实际上,这种内置的并发支持是Java编程语言的最强优势之一,并帮助它在企业界和程…

convert.todatetime指定日期格式_SQL基础知识V2——常用日期函数

点击上方SQL数据库开发,关注获取SQL视频教程SQL专栏SQL数据库基础知识汇总SQL数据库高级知识汇总日期函数是数据库中经常需要使用到的,本期将常用的几个日期函数给小伙伴做详细的介绍。GETDATE()GETDATE()函数用于返回当前数据库系统的日期和时间&#x…

恢复html的初始选定状态,Adobe Photoshop

了解如何在 Adobe Photoshop 中使用“还原/重做”命令和“历史记录”面板来控制图像的状态。通过使用“还原/重做”命令和“历史记录”面板,您可以轻松地控制图像的状态。使用还原或重做命令Photoshop CC 20.0(2018 年 10 月版)中的更新功能从 Photoshop CC 2018 年…

classcastexception异常_优雅的异常处理

代码正常运行不会出问题,但是遇到意外,参数变量,不符合要求,发生意外,代码终止运行代码中的异常处理好了,代码就可以顺利的继续运行!3.3 最近我们遇到过的异常System.out.println(1/0);//java.l…

Spring Boot微服务,Docker和Kubernetes研讨会–第3部分

在之前的文章中,我们为使用Docker和Spring Boot的订单管理系统构建了一些微服务(订单服务,产品服务,客户服务)。 我们使用Netflix库来管理,发现和平衡微服务。 管理这些微服务及其多个容器可能会有些棘手&…

2021年茂名市高考成绩查询,2021年茂名高考最高分多少分,历年茂名高考状元

2021年茂名高考成绩公布时,茂名高考成绩最高分受到很多网友关注,具体2021年茂名高考最高分多少分,考生可以在聚志愿网站查询具体位次排名,报考茂名高考一分一段表位次排名、同分数人数、位次查询等相关数据。本期文章小编主要为大…

客制化键盘键位修改_可以用很漂亮形容的一把键盘,差一步就完美

内置钢板是轴体固定需要也是机械键盘的标志,钢板除了可以带来极其稳定的固定效果也成就了机械键盘扎实的手感,同时是机械键盘分量感的主要来源,给人一种结实感,这是薄膜键帽所不具备的。▲外置钢板在悬浮式结构的键盘上比较常见&a…

adb 切换默认桌面_公告 | 武林外传手游官方服务器全面开放桌面版体验

为了更好的优化玩家游戏体验,应广大客官要求,《武林外传手游》全新桌面版今日上线,iOS及安卓服务器均可在电脑上畅玩《武林外传手游》啦!大屏画面更加细腻绚丽,预设键位助你畅游江湖,欢迎广大玩家下载体验&…

java获取word书签表格数据_Python读取word文档里面的表格数据

更多精彩,请点击上方蓝字关注我们!我们常见的办公数据通常可以分为结构化数据与非结构化数据,比如常见的word, ppt, excel。前两者存储的是非结构化数据,excel存储的是结构化数据。从事数据统计或分析的工作或多或少都会从excel获…

abb智能控制系统_ABB助力国网冀北电力打造虚拟电厂

近日,ABB为国网冀北电力有限公司定制了智能配电计量与协调控制解决方案,对其虚拟电厂进行远程电能管理,实现高峰调节和负载转移,提高电力系统效率,保持供电稳定性。虚拟电厂是通过分布式电力管理系统将电网中发电端(尤…

通过通用数据访问扩展AWS生态系统

Amazon Web Services(AWS)可帮助组织托管和管理其数据流程,例如构建数据可视化和执行ETL任务。 在CData,我们可以轻松地将AWS Services与异构业务应用程序和分布式数据存储连接起来,以最终帮助企业对其数据进行更全面的…

android官方文档中文版_Now in Android:01 - 如何掌握最新的 Android 技术?

每隔几天我都会通过 Android Developers 的油管官方频道,来了解一下最近 Android 发布了哪些有趣的新技术,最近发现官方推出了一个新的系列视频叫做:Now in Android,目前更新了 4 期,我觉得这个系列蛮有趣的&#xff0…

c++ 反射_固体火箭发动机黏接壳体超声C扫描检测系统研制与应用

某固体火箭发动机燃烧室采用壳体/绝热层/包覆层/推进剂的多界面结构形式,其中绝热层采用玻璃纤维缠绕成型后与钢质旋压壳体胶接而成。在胶接过程中,若存在壳体内部多余物清理不干净、绝热层与壳体配合不严、胶层内部气体未排净等情况,黏接层易…

java scala_经过几天的Scala回归Java的10个最烦人的事情

java scala因此,我正在尝试使用Scala,因为我想编写一个解析器,而Scala Parsers API似乎非常合适。 毕竟,我可以在Scala中实现解析器并将其包装在Java接口后面,因此除了附加的运行时依赖关系之外,应该不存在…

python区域找图命令_python读取图片任意范围区域

使用python进行图片处理,现在需要读出图片的任意一块区域,并将其转化为一维数组,方便后续卷积操作的使用。 下面使用两种方法进行处理: convert 函数 from PIL import Image import numpy as np import matplotlib.pyplot as plt …

[MEGA DEAL] Ultimate SQL Bootcamp认证捆绑包(98%)

像Pro一样管理任务和数据库,提供有关SQL Lite,Microsoft SQL,MySQL,PostgreSQL,Rest API和Oracle SQL的6门课程 嘿,怪胎, 本周,在我们的JCG Deals商店 ,我们提供了另一…