AOP实现控制层拦截打印请求参数

该博客介绍了如何使用SpringBoot和Log4j创建一个请求拦截器,详细记录请求的IP、URL、方法、参数等信息,以便在前后台纠纷中提供证据。代码示例展示了切点定义、AOP注解的使用,以及请求和响应信息的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:为了解决前后台纠纷,方便甩锅拿出证据
环境: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;
}

简单明了,拿来即用

execution表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值