javascript控制臺打印,Spring Boot使用AOP在控制臺打印請求、響應信息

 2023-10-09 阅读 28 评论 0

摘要:AOP稱為面向切面編程,在程序開發中主要用來解決一些系統層面上的問題,比如日志,事務,權限等。 AOP簡介 AOP全稱Aspect Oriented Programming,面向切面,AOP主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處

AOP稱為面向切面編程,在程序開發中主要用來解決一些系統層面上的問題,比如日志,事務,權限等。

AOP簡介

AOP全稱Aspect Oriented Programming,面向切面,AOP主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。其與設計模式完成的任務差不多,是提供另一種角度來思考程序的結構,來彌補面向對象編程的不足。

  通俗點講就是提供一個為一個業務實現提供切面注入的機制,通過這種方式,在業務運行中將定義好的切面通過切入點綁定到業務中,以實現將一些特殊的邏輯綁定到此業務中。

javascript控制臺打印?  比如,現在需要打印請求、響應信息,很多地方有需要,這時候又不能把代碼復制一遍,所有需要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?//?定義一個切面
@Configuration
public?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!"

下面的是我的公眾號二維碼圖片,歡迎關注,歡迎留言,一起學習,一起進步。

ie一打開就無響應。

?

轉載于:https://www.cnblogs.com/haha12/p/10405839.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/134281.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息