前言:
通过使用AOP获取被调接口的请求信息,然后再切面中处理具体的业务需求
代码示例如下:
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
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.Arrays;
import java.util.Enumeration;
@Component
@Aspect
@Slf4j
public class ActionAspect {
@Pointcut(value = "execution(* cn.swifthealth.api..*.*Controller..*(..))")
public void aspect() {
}
@Before("aspect()")
public void before(JoinPoint joinPoint) {
log.info("the request details:");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
log.info("请求url: {}", request.getRequestURL().toString());
log.info("请求方法: {}", request.getMethod());
String className = joinPoint.getSignature().getDeclaringTypeName();
log.info("执行的类名: {}", "(" + className.substring(className.lastIndexOf(".") + 1) + ".java:1)");
log.info("执行的方法名: {}", joinPoint.getSignature().getName());
log.info("参数: {}", Arrays.toString(joinPoint.getArgs()));
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String paraName = enu.nextElement();
log.info(paraName + ": {}", request.getParameter(paraName));
}
}
@Around("aspect()")
public Object around(ProceedingJoinPoint jp) throws Throwable {
Object[] args = jp.getArgs();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String method = request.getMethod().toLowerCase();
try {
long start = System.currentTimeMillis();
Object rvt = jp.proceed(args);
long end = System.currentTimeMillis();
log.info("-----------------------------------");
log.info("执行时间为[{}]ms", (end - start));
log.info("-----------------------------------");
if (method.equals("options")) {
return rvt;
}
return rvt;
} catch (Exception e) {
log.error("系统错误catch:", e);
e.printStackTrace();
throw e;
}
}
@After(value = "aspect()")
public void after() {
}
}