ControllerLogAspect.java
import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
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.io.BufferedReader;
import java.util.Map;
/**
* @Description:AOP切入点记录操作日志
* @Author:chenyanbin
* @Date:2021/3/19 下午11:30
* @Versiion:1.0
*/
@Aspect
@Order(5)
@Component
public class ControllerLogAspect {
@Autowired
LogTask logTask;
//切入点表达式
@Pointcut("execution(public * com.ybchen.service.trace.controller..*.*(..))")
public void controllerLog() {
}
/**
* 进入controller之前,拿请求参数
* @param joinPoint
* @throws Throwable
*/
@Before("controllerLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String params = null;
String ip = request.getRemoteAddr();
// 只记录post方法
if ("POST".equals(request.getMethod())) {
// 记录下请求内容
System.out.println("请求URL : " + request.getRequestURL());
System.out.println("请求IP : " + request.getRemoteAddr());
System.out.println("请求方法 : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
// 获取参数, 只取自定义的参数, 自带的HttpServletRequest, HttpServletResponse不管
BufferedReader br = request.getReader();
String str, wholeStr = "";
while ((str = br.readLine()) != null) {
wholeStr += str;
}
StringBuilder stringBuilder = new StringBuilder();
if ("".equals(wholeStr)) {
System.out.println("不是json提交,重新获取post请求参数");
Map<String, String[]> parameterMap = request.getParameterMap();
parameterMap.forEach((k, v) -> {
if (v != null && v.length > 0) {
for (int i = 0; i < v.length; i++) {
stringBuilder.append(v[i]);
}
}
System.out.println("post请求,key= " + k + " ,value= " + stringBuilder.toString());
});
} else {
System.out.println("post请求参数:" + wholeStr);
params = wholeStr;
}
params = stringBuilder.toString();
}
if ("GET".equals(request.getMethod())) {
System.out.println("请求URL : " + request.getRequestURL());
System.out.println("请求IP : " + request.getRemoteAddr());
System.out.println("请求参数:" + request.getQueryString());
params = request.getQueryString();
}
logTask.addLog(ip, params);
}
/**
* 接口执行之后,获取响应结果
* @param ret
* @throws Throwable
*/
@AfterReturning(returning = "ret", pointcut = "controllerLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
System.out.println("返回 : " + JSON.toJSONString(ret));
}
}
LogTask.java
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.io.IOException;
/**
* @Description:记录日志
* @Author:chenyanbin
* @Date:2021/3/19 下午7:08
* @Versiion:1.0
*/
@Service
public class LogTask {
@Async
public void addLog(String ip, String params) throws IOException {
System.out.println("异步保存日志,ip=" + ip + ",参数值:" + params);
}
}