AOP
该切面仅用于请求日志记录,若有其他需求,在此基础上扩展即可,不多逼逼,直接上代码。
引入切面依赖
<!-- 切面 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
日志切面类
import com.alibaba.fastjson.JSON;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Slf4j
@Aspect
@Component
public class RequestAop {
private static final String START_TIME = "request-start";
// 按需修改需要扫描的controller层
@Pointcut("execution(* com.example.controller..*.*(..))")
public void pointCut() {
//该方法仅用于扫描controller包下类中的方法,而不做任何特殊的处理。
}
@Before("pointCut()")
public void doBefore(JoinPoint joinPoint) {
HttpServletRequest request =
((ServletRequestAttributes) Objects
.requireNonNull(RequestContextHolder.getRequestAttributes()))
.getRequest();
Long start = System.currentTimeMillis();
request.setAttribute(START_TIME, start);
}
@Around("pointCut()")
@SneakyThrows
public Object doAround(ProceedingJoinPoint joinPoint) {
Object result = joinPoint.proceed();
try {
// 获取方法名称
String method = joinPoint.getSignature().getName();
// 获取类名称
String className = joinPoint.getSignature().getDeclaringTypeName();
// 获取请求
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
// 请求路径
String requestUrl = request.getRequestURL