package com.example.test.aop;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Aspect
@Component
public class LookAop {
// @Pointcut("@annotation(com.example.test.aop.Look)")
// public void pointcut() {}
@Pointcut("execution(* com.example.test.controller.TestController.*(..))")
public void pointcut() {}
/**
* 在请求到controller层的方法时还未进到方法里,提前拦截下来请求的参数
* @param joinPoint
*/
// @Before("pointcut()")
@Before("execution(* com.example.test.controller.TestController.*(..))")
public void before(JoinPoint joinPoint) {
Signature signature = joinPoint.getSignature();
Class declaringType = signature.getDeclaringType();
String name = signature.getName();
String declaringTypeName = signature.getDeclaringTypeName();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Map<String, String[]> parameterMap = request.getParameterMap();
parameterMap.forEach((k, v) -> {
System.out.println("这是aop的k : " + k);
System.out.println("这是aop的v : " + v[0]);
});
//这是aop: class com.example.test.controller.TestController
System.out.println("这是aop: " + declaringType);
//这是aop: down(方法名字)
System.out.println("这是aop: " + name);
//这是aop: com.example.test.controller.TestController
System.out.println("这是aop: " + declaringTypeName);
}
}
对于有些业务需要,提前校验入参还是有必要的,就随手写个Demo记录一下