前提:为了解决前后台纠纷,方便甩锅拿出证据
环境:SpringBoot+Log4j
话不多说,直接上代码
import com.alibaba.fastjson.JSON;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
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 javax.servlet.http.HttpServletResponse;
/**
* @author yhh
* @Description:拦截请求
* @date 2020/10/22 15:23
*/
@Aspect
@Order(5)
@Component
public class ControllerLogAspect {
private Logger logger = Logger.getLogger(getClass());
@Pointcut("execution(切点的路径)")
public void controllerLog() {
}
@Before("controllerLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
logger.info("==============================================Begin=======================================");
// 记录下请求内容,对象封装避免并发情况下串行
RequestInfo info = new RequestInfo();
//请求ip
info.setIp(request.getRemoteAddr());
//请求方式
info.setMethod(request.getMethod());
//请求URL
info.setUrl(request.getRequestURL().toString());
//请求方法
info.setRequestMethod(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
//根据请求方式判断参数内容
if("POST".equals(request.getMethod())){
if (joinPoint.getArgs().length > 0) {
for (Object o : joinPoint.getArgs()) {
//只取自定义的参数, 自带的HttpServletRequest, HttpServletResponse不管
if (o instanceof HttpServletRequest || o instanceof HttpServletResponse) {
continue;
}
//如果是文件对象
/* if (o instanceof MultipartFile) {
MultipartFile file = (MultipartFile) o;
o = file.getOriginalFilename(); //获取文件名
}*/
info.setRequestParams(o);
}
}
}else if("GET".equals(request.getMethod())){
info.setRequestParams(request.getParameterMap());
}
logger.info("Request Info : "+JSON.toJSONString(info));
}
@After("controllerLog()")
public void doAfter(JoinPoint joinPoint) {
logger.info("==============================================End==========================================");
}
/**
* 拦截返回
* 注释(数据太多)
* @param ret
* @throws Throwable
*/
// @AfterReturning(returning = "ret", pointcut = "controllerLog()")
// public void doAfterReturning(Object ret) throws Throwable {
// // 处理完请求,返回内容
// logger.info("返回 : " + JSON.toJSONString(ret));
// }
}
public class RequestInfo {
private String ip;
private String url;
private String method;
private String requestMethod ;
private Object requestParams;
}
简单明了,拿来即用