AOP打印参数在并发情况下会出现请求信息线程串行的问题,经改造如下:
package com.example.aspect;
import com.alibaba.fastjson2.JSON;
import com.pacific.external.callback.util.CurrentContextUtils;
import org.apache.commons.lang.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* ClassName HttpAspect
*
* @Description AOP 日志打印
* @Author mingtian
* @Date 2022/5/13 13:18
* @Version 1.0
*/
@Aspect
@Component
public class HttpAspect {
/**
* 打印日志
*/
protected Logger logger = LoggerFactory.getLogger(HttpAspect.class);
/**
* 跨行
*/
private static final String LINE_SEPARATOR = System.lineSeparator();
/**
* 要处理的方法,包名+类名+方法名
*/
@Pointcut("execution(* com.example.controller..*.*(..))")
public void cut() {
}
/**
* //在调用上面 @Pointcut标注的方法前执行以下方法
*
* @param joinPoint
*/
@Before("cut()")
public void doBefore(JoinPoint joinPoint) {
("------------------------ Start ----------------------------");
HttpServletRequest request = CurrentContextUtils.getCurrentRequestInfo();
Signature signature = joinPoint.getSignature();
StringBuilder requestInfo = new StringBuilder(32);
// 打印请求参数
requestInfo.append(LINE_SEPARATOR);
requestInfo.append("Request MethodType:").append(request.getMethod()).append(LINE_SEPARATOR);
requestInfo.append("Request IP:").append(request.getRemoteAddr()).append(LINE_SEPARATOR);
requestInfo.append("Request Url:").append(request.getRequestURL().toString()).append(LINE_SEPARATOR);
requestInfo.append("Request Class.Methods:").append(signature.getDeclaringTypeName()).append(".").append(signature.getName()).append(LINE_SEPARATOR);
Object[] args = joinPoint.getArgs();
// 序列化时过滤掉request和response
List
获取当前线程工具类:
package com.example.util;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Description: CurrentContextUtils 获取当前线程方法
* @Author: mingtian
* @CreateDate: 2022/5/13 13:12
* @Version: 1.0
*/
public class CurrentContextUtils {
/**
* 返回当前线程上下文request信息
*
* @return
*/
public static HttpServletRequest getCurrentRequestInfo() {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
return servletRequestAttributes.getRequest();
}
/**
* 返回当前线程上下文response信息
*
* @return
*/
public static HttpServletResponse getCurrentResponseInfo() {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
return servletRequestAttributes.getResponse();
}
}