下一篇文章将演示如何使用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上的结果:

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

伊丹

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

使用Spring AOP,自定义注释和反射为您的应用审核基础架构相关推荐

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

    spring aop 注释 下一篇文章将演示如何使用Spring AOP和注释编写简单的审计. 审核机制将是干净,高效且易于维护的(和Kewwl!). 我将在用户管理系统上演示我的示例(假设您具有反射 ...

  2. spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)

    spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...

  3. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  4. spring使用自定义注解_用Spring组成自定义注释

    spring使用自定义注解 Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本 ...

  5. 用Spring组成自定义注释

    Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本文中,我们将介绍一个非常有用 ...

  6. Spring AOP 自定义注解记录操作日志

    1.自定义注释 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface ...

  7. Spring AOP自定义注解并获取注解的参数

    环境 springboot:1.5 Intellij IDEA:2021.1 序言 最近有个需求,要做方法层面的权限控制.以前在公司使用的是spring security,然后使用注解 如下: @Pr ...

  8. Java之——Spring AOP自定义注解实现日志管理

    转载请注明出处:https://blog.csdn.net/l1028386804/article/details/80295737 1.定义日志类SystemLog package io.mykit ...

  9. 使用Spring AOP自定义注解方式实现用户操作日志记录

    1,开发环境 操作系统:Windows 7 JDK:1.8.0_161 Eclipse:Mars.2 Release (4.5.2) 2,自定义注解类UserLog @Target({ElementT ...

最新文章

  1. 【视图】ABAP Views
  2. hadoop知识整理(2)之MapReduce
  3. JavaScript数组内置排序函数
  4. gabor变换人脸识别的python实现,att_faces数据集平均识别率99%
  5. C# 根据EXCEL自动生成oracle建表语句
  6. 编写c高级语言程序步骤,高级语言程序设计知识点总结一
  7. SCS【1】今天开启单细胞之旅,述说单细胞测序的前世今生
  8. 网络编程——CS模型(总结)
  9. 使用 java.lang.Math 类完成编程
  10. 中科院计算机学院考研真题,2021年862计算机学科中国科学院大学考研真题及详解...
  11. P4417 [COCI2006-2007#2] STOL
  12. zcmu Problem C: kirito's 星爆气流斩(背包+二进制优化)
  13. 橄榄核雕:始知真放在精微
  14. 8.0.高等数学3-向量的乘法运算(数量积、向量积与混合积)
  15. 数据网站 免费数据网站
  16. STL容器迭代器的理解
  17. css3多米诺骨牌动画特效
  18. 爬虫:汽车之家字体反爬
  19. 大学生职业生涯规划书性格特征_大学生职业生涯规划书【十篇】
  20. python用mpl_finance中的candlestick_ohlc画分时图

热门文章

  1. mysql预编译语句拼接查询_SQL语句预编译(查询)
  2. 第2步 安装git 配置git用户 git的安装和项目的建立
  3. 玩物得志Java笔试题_代码规范利器-CheckStyle
  4. controller属于哪一层_别急着换5G,4G手机同样值得考虑!哪几款安卓手机称得上4G机皇?...
  5. rabbitmq-java生产者消费者
  6. java前台线程(普通线程) 和 后台线程
  7. javafx 动画没效果_通过JavaFX标注制作动画效果
  8. cloud foundry_Cloud Foundry Java客户端–流事件
  9. javafx阴影_JavaFX技巧23:节省内存! 属性的阴影场
  10. java ee jms_在Java EE 7中自动配置JMS资源