目標:打印某個controller#handler方法的帶有 @RequestParam注解的參數名(注解的value值)和參數值
package com.sanlian.bigdata.aop; import com.guanxin.base.annotation.RequestParam; 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.aspectj.lang.reflect.MethodSignature; 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.lang.annotation.Annotation; import java.util.LinkedHashMap; import java.util.Map; /** * 自定義切面類: 打印 controller 參數和執行情況 * * @Auther: oy * @Date: 2020/8/4 10:55 */ @Component @Aspect public class LoggerAspect { Logger logger = LoggerFactory.getLogger(LoggerAspect.class); // 定義公共切入點 @Pointcut("execution(public * com.sanlian.bigdata.ctrl.*.*(..))") public void webLog() { } @Around("webLog()") public Object around(ProceedingJoinPoint pjp) throws Throwable { long startTime = System.currentTimeMillis(); Object result = pjp.proceed(); long time = System.currentTimeMillis() - startTime; // 接收到請求,記錄請求內容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 獲取handler的參數(不包括 request 和 response) // List<Object> logArgs = Arrays.stream(pjp.getArgs()) // .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse))) // .collect(Collectors.toList()); // 記錄下請求內容 logger.info("URL : " + request.getRequestURL().toString() + "=============="); logger.info("HTTP_METHOD : " + request.getMethod()); logger.info("IP : " + request.getRemoteAddr()); logger.info("CLASS_METHOD : " + pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName()); // 獲取所有參數上的注解 MethodSignature signature = (MethodSignature) pjp.getSignature(); Annotation[][] parameterAnnotations = signature.getMethod().getParameterAnnotations(); Map<String, Object> params = new LinkedHashMap<>(); int index = 0; for (Annotation[] annotations : parameterAnnotations) { for (Annotation anno : annotations) { //System.out.println(anno.getClass()); // class com.sun.proxy.$Proxy149 if (anno instanceof RequestParam) { params.put(((RequestParam) anno).value(), pjp.getArgs()[index++]); } } } logger.info("params : " + params); //logger.info("ARGS : " + logArgs); logger.info("handler執行時長 : " + time + " ms ========================================="); return result; } }
打印結果:
---