Spring Boot使用AOP在控制台打印请求、响应信息
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等。
AOP简介
AOP全称Aspect Oriented Programming,面向切面,AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。其与设计模式完成的任务差不多,是提供另一种角度来思考程序的结构,来弥补面向对象编程的不足。
通俗点讲就是提供一个为一个业务实现提供切面注入的机制,通过这种方式,在业务运行中将定义好的切面通过切入点绑定到业务中,以实现将一些特殊的逻辑绑定到此业务中。
比如,现在需要打印请求、响应信息,很多地方有需要,这时候又不能把代码复制一遍,所有需要AOP来实现。
常用注解说明
@Aspect -- 作用是把当前类标识为一个切面供容器读取
@Pointcut -- (切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
@Before -- 标识一个前置增强方法,相当于BeforeAdvice的功能
@AfterReturning -- 后置增强,相当于AfterReturningAdvice,方法退出时执行
@AfterThrowing -- 异常抛出增强,相当于ThrowsAdvice
@After -- final增强,不管是抛出异常或者正常退出都会执行
@Around -- 环绕增强,相当于MethodInterceptor
pom.xml中引入AOP的jar包
<!-- aop --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency> <!-- fastjson --><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version></dependency>
切面类代码
package com.example.helloSpringBoot.aop;
import com.alibaba.fastjson.JSON;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.Configuration;import org.springframework.web.context.request.RequestAttributes;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/** * 切面 打印请求、返回参数信息 */@Aspect // 定义一个切面@Configurationpublic class LogRecordAspect { private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class);
// 定义切点Pointcut @Pointcut("execution(* com.example.helloSpringBoot.controller.*Controller.*(..))") public void excudeService() { }
@Around("excudeService()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { RequestAttributes ra = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes) ra; HttpServletRequest request = sra.getRequest();
String method = request.getMethod(); String uri = request.getRequestURI(); String paraString = JSON.toJSONString(request.getParameterMap()); logger.info("***************************************************"); logger.info("请求开始, URI: {}, method: {}, params: {}", uri, method, paraString);
// result的值就是被拦截方法的返回值 Object result = pjp.proceed(); logger.info("请求结束,controller的返回值是 " + JSON.toJSONString(result)); return result; }}
测试打印结果
浏览器分别访问 http://localhost:8080/hello?a=1&b=2 和http://localhost:8080/hello?c=11&d=22,控制台打印结果如下:
***************************************************请求开始, URI: /hello, method: GET, params: {"a":["1"],"b":["2"]}请求结束,controller的返回值是 "hello spring boot!"***************************************************请求开始, URI: /hello, method: GET, params: {"c":["11"],"d":["22"]}请求结束,controller的返回值是 "hello spring boot!"
下面的是我的公众号二维码图片,欢迎关注,欢迎留言,一起学习,一起进步。
转载于:https://www.cnblogs.com/haha12/p/10405839.html
Spring Boot使用AOP在控制台打印请求、响应信息相关推荐
- spring mvc通过aop在控制台打印log日志,包含请求controller、method、url、remoteaddr、返回值,方便调试
1:导入对应的包 在maven xml文件中加入 <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->< ...
- Spring Boot——基于AOP的HTTP操作日志解决方案
解决方案 package com.hailiu.web.aop;import com.fasterxml.jackson.databind.ObjectMapper; import com.haili ...
- Spring Boot 使用 AOP 实现页面自适应
鉴于复杂页面自适应的难度,一般会做几套模板分别适应手机.平板.电脑等设备.使用 Spring Boot 开发单体应用时,一般会使用 Thymeleaf 模板,那么可以使用 AOP 技术来实现页面自适应 ...
- Spring Boot 集成AOP
在这里多谈一些关于AOP 方面的知识,如果你对AOP 方面的知识比较熟悉,可以直接略过这个段落,往下看. 一.AOP概述 AOP(面向切面编程) 概念:这种在运行时,动态地将代码切入到类的指定方法.指 ...
- Spring Boot中使用log4j实现http请求日志入mongodb
之前在<使用AOP统一处理Web请求日志>一文中介绍了如何使用AOP统一记录web请求日志.基本思路是通过aop去切web层的controller实现,获取每个http的内容并通过log4 ...
- Spring Boot使用CommonsRequestLoggingFilter记录传入的请求
原理 Spring 自带 AbstractRequestLoggingFilter,在处理请求之前和之后执行日志记录操作,这个过滤器需要一个子类来覆盖beforeRequest(HttpServlet ...
- Spring boot自定义切面拦截所有的请求 或者方法原理一样
原代码 下面的例子是小编在自己的环境中测试过得. 代码 **@Pointcut("!execution(public * com..controller.SysLoginController ...
- 聊聊Spring Boot服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!...
来自:https://juejin.im/post/5e2179def265da3e152d2561 前言 去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上.这不,最近我就被分配了要 ...
- Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控...
作者:Richard_Yi 来源:http://39sd.cn/B2A0B 去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上.这不,最近我就被分配了要将我们核心的微服务应用全部监控起 ...
最新文章
- python opencv 中bmp转raw格式图片并展示
- 理解深度学习中的学习率及多种选择策略
- 中兴同美司法部和解协议获准:罚12亿美元
- NYOJ 659 判断三角形
- python模块之re正则表达式
- VTK:几何对象之ColoredLines
- c语言用什么能暂存结构指针,c语言中什么是指针
- 控制器局域网can总线
- 在python中、实例变量在类的内部通过_[宜配屋]听图阁
- 学成在线--11.RabbitMQ快速入门
- 风控策略分析中最重要的五步心法
- td中bug处理过程_特斯拉的致命BUG,埃安LX的L3能解开吗?
- plsql打开sql窗口快捷键_可以提升3倍开发效率的 Intellij IDEA快捷键大全汇总(2019)...
- 随机获取部分ListObject集合
- C# dataGridView控件 字体配置问题 字体大小 修改字体
- SaaS-HRM(2)数据库设计与前端框架(企业管理前后台)
- uchome持久XSS(2.0版本测试通过)
- HTML入门学习教程:简单网页制作
- Java学多久可以接项目_自学Java,多久可以找到工作?
- FxCAD实验一 简单图形的绘制
热门文章
- java求最小生成树的权重_给定有权无向图的邻接矩阵如下,求其最小生成树的总权重,代码。...
- pythonfor循环输入_python的for循环
- Jupyter运行GitHub里的MXNet源代码
- 高级排序之分割法(以某数为基准分割)
- git使用git push 命令跳出remote: Permission to Aname denied to usernameB 的问题
- VoIP之语音编码器
- 关于 IdentityServer4 中的 Jwt Token 与 Reference Token
- 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队
- tastypie使用cache对list data无效问题
- Visual Studio 2015 RC中的ASP.NET新特性和问题修正