aop实现接口请求参数打印

1.面向切面编程(AOP)Aspect Oriented Programming。

切面编程的目的是为了把通用逻辑从业务逻辑分离出来。

作为一个Java开发,基本是离不开spring的,spring 的核心基础功能就是Ioc和Aop。

这里我的应用是打印接口请求的URL、IP、请求方式以及入参,方便接口调试。

2.代码如下,拷贝可以直接使用,很方便。没基础的同学,请自己先行补充理论知识。

 

复制代码
@Aspect
@Component
public class ParamLogAspect {

    private static final Logger logger = LoggerFactory.getLogger(ParamLogAspect.class);

    /**
     * 定义一个切点
     * 切入 controller包
     *      api包
     *      commonInterface.controller
     *      commonInterface.service.impl
     *      下的所有类的所有方法
     */
    @Pointcut("execution(* com.meritdata.cloud.shellmiddleplatform.dataservice.fourInOne.controller.*.*(..))" +
            "||execution(* com.meritdata.cloud.shellmiddleplatform.dataservice.fourInOne.api.*.*(..)) " +
            "||execution(* com.meritdata.cloud.shellmiddleplatform.dataservice.fourInOne.commonInterface.controller.*.*(..)) ")
    public void validateMethod(){

    }

    @Before("validateMethod()")
    public void validate(JoinPoint joinPoint){

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        logger.info("=====URL : " + request.getRequestURL().toString());
        logger.info("=====IP : " + request.getRemoteAddr()+"  HTTP_METHOD :" + request.getMethod());
        StringBuffer body = new StringBuffer();
        Object[] arguments = joinPoint.getArgs();
        //获取方法的参数
        if(arguments.length!=0){
            try {
                Map<String, Object> params = params = (Map<String, Object>)arguments[0];
                for (String key:params.keySet()
                ) {
                    body.append(key).append(":").append(params.get(key)).append(";");
                }
                if(body.toString().length()==0){
                    logger.info("body参数为空!");
                }else {
                    logger.info("=====方法接收参数[{}]",body.toString().substring(0,body.toString().length()-1));
                }

            }catch (Exception ex){
                logger.info("=====方法接收参数[{}]",arguments[0].toString());
            }
        }

        //获取问号拼接的参数:
        Enumeration<String> enu = request.getParameterNames();
        while (enu.hasMoreElements()) {
            String paraName = (String) enu.nextElement();
            if (!StringUtils.isEmpty(request.getParameter(paraName))) {
                logger.info("=====问号后param : " + paraName + " : " + request.getParameter(paraName));
            }
        }

    }


}
复制代码

 

posted @   shog808  阅读(1025)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示