- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SpringBoot@Aspect 打印访问请求和返回数据方式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
为什么要用aspect, 使用aspect 可以使记录日志的功能面向切面,这样可以降低代码的耦合性。提供了两种方式对输入输出的数据进行打日志,如下:
@Before 和 @AfterReturning 来对 controller 进行切面.
输出数据:
@Around 来对controller 进行切面.
输出数据:
两种方法都是能够对请求数据做日志监控.
第一种方式和第二种方式有一些不同,第二种方式使用的是@Around 环绕的方式去做的处理,joinPoint.proceed()返回数据需要等方法执行完才能执行下面的代码,这种是阻塞式的请求,所以个人建议还是采用第一种方法比较合适.
。
<!--springBoot的aop--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
@Component@Aspectpublic class JournalServiceAspect {}
/**切面点*/ private final String POINT_CUT = "execution(* com.xx.xx..*(..))"; @Pointcut(POINT_CUT) private void pointcut(){}
/** * 前置通知,方法调用前被调用 * @param joinPoint */ @Before(value = POINT_CUT)public void before(JoinPoint joinPoint){ logger.info("前置通知"); //获取目标方法的参数信息 Object[] obj = joinPoint.getArgs(); //AOP代理类的信息 joinPoint.getThis(); //代理的目标对象 joinPoint.getTarget(); //用的最多 通知的签名 Signature signature = joinPoint.getSignature(); //代理的是哪一个方法 logger.info("代理的是哪一个方法"+signature.getName()); //AOP代理类的名字 logger.info("AOP代理类的名字"+signature.getDeclaringTypeName()); //AOP代理类的类(class)信息 signature.getDeclaringType(); //获取RequestAttributes RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); //从获取RequestAttributes中获取HttpServletRequest的信息 HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST); //如果要获取Session信息的话,可以这样写: //HttpSession session = (HttpSession) requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION); //获取请求参数 Enumeration<String> enumeration = request.getParameterNames(); Map<String,String> parameterMap = Maps.newHashMap(); while (enumeration.hasMoreElements()){ String parameter = enumeration.nextElement(); parameterMap.put(parameter,request.getParameter(parameter)); } String str = JSON.toJSONString(parameterMap); if(obj.length > 0) { logger.info("请求的参数信息为:"+str); } }
**注意:这里用到了JoinPoint和RequestContextHolder.
1)、通过JoinPoint可以获得通知的签名信息,如目标方法名、目标方法参数信息等.
2)、通过RequestContextHolder来获取请求信息,Session信息。** 。
/** * 后置返回通知 * 这里需要注意的是: * 如果参数中的第一个参数为JoinPoint,则第二个参数为返回值的信息 * 如果参数中的第一个参数不为JoinPoint,则第一个参数为returning中对应的参数 * returning:限定了只有目标方法返回值与通知方法相应参数类型时才能执行后置返回通知,否则不执行,* 对于returning对应的通知方法参数为Object类型将匹配任何目标返回值 * @param joinPoint * @param keys */ @AfterReturning(value = POINT_CUT,returning = "keys") public void doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){ logger.info("第一个后置返回通知的返回值:"+keys); } @AfterReturning(value = POINT_CUT,returning = "keys",argNames = "keys") public void doAfterReturningAdvice2(String keys){ logger.info("第二个后置返回通知的返回值:"+keys); }
/** * 后置异常通知 * 定义一个名字,该名字用于匹配通知实现方法的一个参数名,当目标方法抛出异常返回后,将把目标方法抛出的异常传给通知方法; * throwing:限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知,否则不执行, * 对于throwing对应的通知方法参数为Throwable类型将匹配任何异常。 * @param joinPoint * @param exception */ @AfterThrowing(value = POINT_CUT,throwing = "exception") public void doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){ //目标方法名: logger.info(joinPoint.getSignature().getName()); if(exception instanceof NullPointerException){ logger.info("发生了空指针异常!!!!!"); } }
/** * 后置最终通知(目标方法只要执行完了就会执行后置通知方法) * @param joinPoint */ @After(value = POINT_CUT) public void doAfterAdvice(JoinPoint joinPoint){ logger.info("后置最终通知执行了!!!!"); }
/** * 环绕通知: * 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。 * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型 */ @Around(value = POINT_CUT) public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ logger.info("环绕通知的目标方法名:"+proceedingJoinPoint.getSignature().getName()); try { Object obj = proceedingJoinPoint.proceed(); return obj; } catch (Throwable throwable) { throwable.printStackTrace(); } return null; }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/sai739295732/article/details/81741417 。
最后此篇关于SpringBoot@Aspect 打印访问请求和返回数据方式的文章就讲到这里了,如果你想了解更多关于SpringBoot@Aspect 打印访问请求和返回数据方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在html中我可以设置背景图片的下面属性吗?(图片在iOS中我可以像下面这样设置图片的填充属性,但我不知道html中是否有类似的属性): Scale to Fill, Aspect Fit, Aspe
我一直在我的 OpenCV 和 OpenGL 组件之间来回切换,我不确定这两者中的哪一个应该更正这个问题。 使用 OpenCV 相机校准产生 fx、fy,纵横比大约为 1,这对应于正方形大小的图像。我
我正在使用 Perf4j 进行性能日志记录。 它指定您使用 aop.xml 来定义要在编译时调用哪个方面,具体取决于您使用的日志系统。我无法让它获取 src/main/webapp/meta-inf/
下方的分享图标(图片为白色)为 114x128 像素。 不过,使用 AutoLayout 将 Interface Builder 中的高度固定为 23 像素,然后对 Content Mode 使用 A
我正在尝试编写一个简单的 Spring Rest Web 服务,因为我不熟悉 Maven(并且因为 Maven 通常无法完成工作 - 连接问题),所以我现在正在尝试 ant 构建。现在,构建正常,服务
我使用网格和Flexbox布局了以下元素:。我希望在2x2的网格中布局.int元素,而.square元素的纵横比保持为1。。到目前为止,我有以下几个css:。如果视区的宽度大于高度(例如,横向),则可
I have the following elements laid out using both Grid and Flexbox:我使用网格和Flexbox布局了以下元素: <div
我在 UITableViewCell 中使用了 UIImageView,它将填充 contentView。我尝试了不同的模式,如“缩放以填充”、“Aspect Fit”、“” Aspect Fill”
我有一个方面排序列表。 public override void OnInvoke(MethodInterceptionArgs args) { args.Proceed(); var
我发现 Instagram 有一个像 300*300 这样的摄像头窗口?它是一个正方形,然后我尝试使用 GPUImage 制作相同的摄像头尺寸。所以我这样写: primaryView = [GPUIm
我一直致力于向 Spring MVC webapp 添加方面,但方面没有执行。我试图把它归结为一些简单的东西,显然应该可以工作,但仍然不行。这是我现在所处的位置: // imports... @Asp
我有一个运行特定逻辑的@After java 方面。我需要它返回一个结果(一个对象),该结果可以在方面切入点拦截的方法中使用。是否可以? 最佳答案 您需要的是@Around,它允许您将想要的任何内容返
SpringBoot@Aspect 打印访问请求和返回数据 为什么要用aspect, 使用aspect 可以使记录日志的功能面向切面,这样可以降低代码的耦合性。提供了两种方式对输入输出的数据进行打
我想从业务类中的方法访问局部变量,在方面类中的方法中。例如 class BusinessClass { public void simpleTest() { ...
我尝试使用 @Aspect 来记录所有请求和响应。如果我的端点有 @RequestBody,我的代码正在运行,但我的 get 端点没有 @RequestBody 并且我看不到日志。这是对这种情况的任何
我在学习AOP时遇到了一个场景。 所有类都在包com.spring内和Pointcut定义@AfterReturning Advice 的类型对于任何包类中的任何方法 com.spring具有任意数量
我是 alfresco 新手,我想创建一个能够提取自定义方面属性元数据的程序,我发现有人在谈论 Alfresco opencmis 扩展,但我不知道如何使用它,有吗我可以遵循教程吗? 最佳答案 如果您
你好我正在尝试使用 spring 注释和 AspectJ 实现一个方面但我不断收到错误 Aspect无法解析为类型 这是我的 pom.xml : org.spri
在我的网络系统中,我有一个像这样的 AppConfig 类 @Configuration @ComponentScan(basePackages = "com.mypackage") @EnableW
我有一个带有 spring 配置的应用程序服务器-客户端 RMI。现在我不会使用 @Aspect 添加方法调用日志记录。 我在 spring-context.xml 中添加了: 我的logger
我是一名优秀的程序员,十分优秀!