AOP 实现日志记录的功能
要求:
在controller层对update , insert , delete类型的请求对应的方法 进行拦截, 然后获取方法的请求参数,
根据不同的请求类型, 想日志表中计入不同的内容. 这样就可以实现每次改动数据库中表时,就会记录日志.
一般日志表会会记录如下内容:
修改人id
表名称
修改数据行id
修改时间
请求端ip地址
修改内容
实现方式:
我们以update操作计入日志为例
在controller层的update类型的方法上加一个注解(可以是自定义注解, 也可以用springboot的注解)
单独定义一个切面类OperLogAspect , 将加在方法上的注解定义为一个切点.
对这个切点加一个前置通知, 前置通知里 执行计入日志信息的操作.
具体实现如下:
首先看controller层
public class CConsController extends BasicController<CCons,ICConsService>{@PreAuthorize("hasAuthority('billing:cons:insert')")@PostMapping(value = "/insert")public ResponseResult<Object> insert(@RequestBody(required = false) Map<String, Object> paraMap) {...}
}
在insert方法前, 加了一个preAuthorize注解, 注解的value是billing:cons:insert
然后定义一个切面类
@Aspect
@Component
@Slf4j
public class OperLogAspect {@Pointcut("@annotation(org.springframework.security.access.prepost.PreAuthorize)")public void operLogPointCut(){}@Before(value = "operLogPointCut()")public void saveOperLog(JoinPoint joinPoint){// 从切面织入点处通过反射机制获取织入点处的方法MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 获取切入点所在的方法Method method = signature.getMethod();// 获取操作PreAuthorize preAuthorize = method.getAnnotation(PreAuthorize.class);String pre = preAuthorize.value();//如果pre中包含update的字符串的话, 记日志时将修改前数据和修改后数据都记录日志//如果pre中包含insert/delete的话, 记日志时只用将被改的数据计入日志即可Class<IBasicService> basicService = (Class<IBasicService>) ((ParameterizedType) joinPoint.getTarget().getClass().getGenericSuperclass()).getActualTypeArguments()[1];IBasicService service = (IBasicService) SpringUtil.getBean(basicService);Class<BasicEntity> entityClass = (Class<BasicEntity>) ((ParameterizedType) joinPoint.getTarget().getClass().getGenericSuperclass()).getActualTypeArguments()[0];//表名称String tablename = entityClass.newInstance().getTableName();//从线程池获取用户信息//request中获取ip地址//创建日志模板类, 填入日志的数据//调用日志service的insert方法插入日志数据}
}
这里解释一些方法:
getTarget() 获取被调方法的代理类
getClass() 获取类类型
getGenericSuperclass() 获取类的带泛型的父类
joinPoint.getTarget().getClass().getGenericSuperclass(): 获取被调方法的代理类的类类型后获取该类的带泛型的父类
getActualTypeArguments()[0] : 获取第一个泛型
留意controller层, 会发现他的父类传了两个泛型 , 第一个是model , 第二个是service
AOP 实现日志记录的功能相关推荐
- Spring AOP的日志记录
现在的项目是Spring+MyBatis,前段时间项目经理让我干了一个活,就是给所有的controller里的所有方法加上日志记录的代码,其实没有多少,也就300来个方法,也没有抱怨什么,一边打着瞌睡 ...
- 【Spring学习】AOP实现日志记录
AOP知识点 AOP,面向切面编程.通过预编译方式和运行时动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. AOP编程思想就是把很多类对象中的横切问题点,从业务逻辑中分离出来,减少 ...
- Guice+aopalliance实现Aop之 日志记录
前言 由于我们开发中经常需要手动写请求参数以及方法的返回值打印 每个都写显得很繁琐所以今天我们主要使用Guice的注解注入对象功能以及加上aopalliance 的动态代理实现请求参数和响应参数的日志 ...
- 自定义注解-aop实现日志记录
关于注解,平时接触的可不少,像是 @Controller.@Service.@Autowried 等等,不知道你是否有过这种疑惑,使用 @Service 注解的类成为我们的业务类,使用 @Contro ...
- java aop注解日志记录_springMVC自定义注解,用AOP来实现日志记录的方法
需求背景 最近的一个项目,在项目基本完工的阶段,客户提出要将所有业务操作的日志记录到数据库中,并且要提取一些业务的关键信息(比如交易单号)体现在日志中. 为了保证工期,在查阅了资料以后,决定用AOP+ ...
- 【Spring】AOP实现日志记录
我的aop记录日志,可以记录:[ 操作类型.操作描述.参数.登录项目的用户ip] 当然记录什么靠你自己决定. 一.自定义一个注解 @Target({ElementType.METHOD,Element ...
- Spring Boot自定义注解+AOP实现日志记录
访问Controller打印的日志效果如下: *********************************Request请求*********************************** ...
- java aop注解日志记录_spring aop通过注解实现日志记录
首先是几个概念:连接点(Joinpoint).切点(Pointcut).增强(Advice).切面(Aspect) 另外也要使用到注解. 需求:通过注解定义LogEnable.然后程序运行能够识别定义 ...
- java 自定义注解+AOP实现日志记录
ssm版本: 1.首先自定义一个注解,该注解有两个属性,一个是模块名,一个是操作的内容.该注解是用来修饰Service层中的方法的. 2.创建一个切面类,该切面使用@Aspect和@Component ...
最新文章
- [docker]docker压力测试
- 【深度学习】pytorch-tensorflow-anaconda笔记
- Fedora换源:换成aliyun镜像源
- Repeater 操作HeaderTemplat或FooterTemplat模板中控件
- c语言入门经典案例,c语言入门经典案例及飞源代码.doc
- leetcode 870.优势洗牌
- Redis基础6(Redis6管道)
- Restorator软件使exe文件都不能打开,exe不支持此接口
- Restsharp 与 unity3D WWW
- 7教程统计意义_极少人知道的SPSS数据拆分技巧——「杏花开生物医药统计」
- 20行代码制作字符画版小黄鸭表情包
- 短暂的人生、脆弱的生命
- facebuilder免费版_Face Blender(人脸混合器)V2018 最新免费版
- 小米note3的开发者选项在哪里?怎么进入开发者模式?如何显示布局边界?
- ByPass UAC
- 关于SQL中not exists的双重否定的一些记录
- 计算机操作系统--Linux初试05
- 使用docker快速安装Oracle11gR2
- 类中的静态成员变量和静态成员函数
- python 图像变化检测_Python OpenCV 霍夫(Hough Transform)直线变换检测原理,图像处理第 33 篇博客...
热门文章
- Java 实现 1-100内的质数求和,质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数
- 水体悬浮颗粒物含量的测定
- PayPal注册申请详解
- 能够关闭并退出计算机程序的是,Mac如何强制退出程序的方法
- python电脑推荐_Python用什么笔记本电脑较好?
- linux jstat 报错没有此命令,jstat版本不兼容问题
- 处理org.apache.hadoop.hbase.client.ScannerTimeoutException
- CP 测试setup 总结
- 苹果电脑怎么更换计算机模式,MAC电脑Command键怎么调换为Control键?
- [zt]永不被杀的后门-批处理的精华