> 文章列表 > Spring Aop | 通过 @Aspect 实现日志切面,记录接口的请求体参数,返回参数

Spring Aop | 通过 @Aspect 实现日志切面,记录接口的请求体参数,返回参数

Spring Aop | 通过 @Aspect 实现日志切面,记录接口的请求体参数,返回参数


不熟悉Aop的可以先去看看这篇基础文章
https://blog.csdn.net/qq_41437542/article/details/111319232


废话不多说,直接开始上代码,不懂的评论区留言讨论。

0.先添加一下aop依赖

        <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>

1. 创建一个实体,作为接口参数(返回也用这个,懒得再弄个)

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestQueryDTO {private String uuid;private String name;private String phone;
}

2. 创建一个接口,为方便区分记录,改一下请求体参数再返回

@RequestMapping("/test")
@RestController
public class testController {@PostMapping("/addHistory")public TestQueryDTO addHistory(@RequestBody TestQueryDTO query) {query.setName("test修改");query.setPhone("testPhone");query.setUuid("test422c5b144b334a7c97ad8076");return query;}
}

3. 创建aop切面,需要实现的操作class

@Aspect
@Configuration
@Slf4j
public class testAop {@Pointcut("execution(public * com.myRobot.testController.addHistory(..))")public void operationLog() {log.info("日志切面开始");}@Before("operationLog()")public void doOperationLogBefore(JoinPoint joinPoint) {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (attributes == null) {return;}//参数Object[] args = joinPoint.getArgs();JSONObject argJson = JSONObject.parseObject(JSON.toJSONString(args[0]));log.info("接口请求参数,{}", argJson.toJSONString());}@AfterReturning(pointcut = "operationLog()",returning = "returnDto")public void doOperationLogAfter(Object returnDto) {TestQueryDTO returnData = (TestQueryDTO) returnDto;log.info("接口返回参数,{}", returnData);}
}

上方例子中,@Before 是在接口访问前会进行的操作,这里我们通过这个注解,可以拿到请求体,具体看例子的代码。
@AfterReturning则是拿到接口返回的参数,注意需要在注解后添加 returning = "returnDto" 这里的val 需要和方法的参数名称一致。


结果测试:接口可以正常响应

Spring Aop | 通过 @Aspect 实现日志切面,记录接口的请求体参数,返回参数

参数也可以正常拿到

Spring Aop | 通过 @Aspect 实现日志切面,记录接口的请求体参数,返回参数