hello,伙伴们,今天我们一起聊聊 *** 作审计的功能实现,正常来说我们每个系统都会对用户的增删改 *** 作做一些日志记录,防止后续一些 *** 作的追溯或管理员对系统 *** 作信息的管理等。那么今天我们就通过Spring的AOP特性来具体实现。
首先是要记录日志的实体类信息,如下:
public class Record { private String auditName; private String auditTime; private String auditType; private String tableName; private String desc; //其他需记录信息 依需求添加 }
接下来我们创建注解Audit
@Retention(RetentionPolicy.RUNTIME) //注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在 @Target(ElementType.METHOD)//用于描述方法 public @interface Audit { String table() default ""; AuditType type() default "select"; String desc() default ""; }
随后创建切面AuditAspect
@Aspect//定义为切面,把当前类标识为一个切面供容器读取 @Component//创建单例对象,交给spring容器管理 public class AuditAspect { //注入添加日志的业务层service @Autowired private RecordService recordService; //定义切点 (以注解的形式做标识 所有加@Audit注解的业务方法都会执行日志记录信息 @Pointcut("@annotation(cn.annotation.Audit)") public void logPointCut() { } //返回值通知 (业务方法执行完成之后 异步执行 *** 作审计信息) @AfterReturning("logPointCut()") public void saveAuditLog(JoinPoint joinPoint){ //获取 *** 作审计注解 MethodSignature signature = (MethodSignature)joinPoint.getSignature(); Method method = signature.getMethod(); Audit audit = method.getAnnotation(Audit.class); // *** 作日志入库 异步执行 logRecordService.addLogRecord(audit,joinPoint.getArgs()); } }
RecordService业务层中异步执行审计日志方法如下:
@Async public void addLogRecord(Audit audit,Object[] args){ Record logRecord = new Record(); if(Objects.nonNull(audit)&&!"select".equals(audit.type())){ logRecord.setAuditTime(LocalDateTime.now().toString(STANDARD_FORMAT)); logRecord.setAuditType(audit.type()); logRecord.setTableName(audit.table()); logRecord.setName(getUserName()); } JSonArray jsonObject = new JSonArray(args); logRecord.setDesc(jsonObject.toString()); logRecord.setId(getNextId()); recordRepository.save(logRecord); }
接下来我们在更新用户信息的接口上面加上该注解 ,修改下用户信息看看是否将 *** 作日志信息入库:
@Audit(type = "update",table = "user") public void updateUser(User user) { user.setFullName("张三"); userRepository.update(user); }
可以看出修改用户的日志记录已经添加到数据表中。这就是基于Spring AOP简单实现的 *** 作审计功能,伙伴们 会用了嘛 我们下期见!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)