Spring AOP实战--之优雅的统一打印web请求的出参和入参
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 java.util.Enumeration;
@Aspect
@Component
public class WebLogAspect {
private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
@Pointcut("execution(public * com.example.controller..*.*(..))")
public void webLog(){}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 打印请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 打印请求URL
logger.info("URL : {}", request.getRequestURL().toString());
// 打印HTTP方法
logger.info("HTTP Method : {}", request.getMethod());
// 打印IP地址
logger.info("IP : {}", request.getRemoteAddr());
// 打印请求体
Enumeration<String> enumeration = request.getParameterNames();
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
logger.info("{}:{}", key, request.getParameter(key));
}
}
@AfterReturning(pointcut = "webLog()", returning = "ret")
public void doAfterReturning(Object ret) throws Throwable {
// 打印响应内容
logger.info("RESPONSE : {}", ret);
}
}
这段代码使用了AspectJ注解来定义一个切面,用于打印Spring MVC控制器方法的入参和出参。它使用了@Pointcut
来指定切点,即所有com.example.controller
包及其子包下的所有方法。@Before
注解标记的方法将在目标方法执行前执行,用于打印请求相关信息,而@AfterReturning
注解标记的方法将在目标方法返回后执行,用于打印返回结果。这个例子展示了如何使用AOP来优雅地处理日志记录,提高代码的可维护性和可读性。
评论已关闭