整合切面,参数拦截+过滤

简介: 基于Spring AOP实现请求参数日志记录,通过@Aspect切面拦截Controller层入参,自动打印请求来源、URL、方式、方法及参数,并记录执行耗时,便于调试与监控,支持后续扩展至数据库或ELK存储分析。

package cn.zhicall.web.aspect;

import com.zhicall.framework.core.common.utils.log.LogProxy;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
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;

/**

  • @author hebo@zhicall.cn
  • @version 1.0
  • @date 2020/6/5 0005 10:48
  • @Desc 入参前置拦截,借助Spring-AOP
    */
    @Component
    @Aspect
    public class RequestParamsAspect {

    protected final Logger logger = LogProxy.getLogger("REQUEST_PARAM_LOG");

    //为了记录执行时间 方便调试 如果不需要可以去掉
    ThreadLocal startTime = new ThreadLocal<>();

    /*

    • 这样可以扫描controller路径下面全部
    • 我这里路径是com.test.controller
    • .user(包)
    • UserController...
    • .admin(包)
    • AdminController...
      /
      @Pointcut("execution(public
      cn.web.controller...*(..))")
      public void pointCut() {}

      /**

    • 参数进行限制或者拦截(后续可数据库存储或ELK)
    • @param joinPoint
    • @throws Throwable
      */
      @Before("pointCut()")
      public void before(JoinPoint joinPoint) throws Throwable {
      ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
      HttpServletRequest request = attributes.getRequest();
      logger.info("请求来源:" + request.getRemoteAddr());
      logger.info("请求URL:" + request.getRequestURL().toString());
      logger.info("请求方式:" + request.getMethod());
      logger.info("响应方法:" + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
      logger.info("请求参数:" + Arrays.toString(joinPoint.getArgs()));

      startTime.set(System.currentTimeMillis());
      }

      /**

    • 环绕执行(暂未使用)
    • 定义需要匹配的切点表达式,同时需要匹配参数
    • @param pjp
    • @return
    • @throws Throwable
      */
      @Around("pointCut()")
      public Object around(ProceedingJoinPoint pjp) throws Throwable {
      //这句必须有 往下执行方法
      Object result = pjp.proceed();
      logger.info("耗时(毫秒):" + (System.currentTimeMillis() - startTime.get()));
      return result;
      }

      /**

    • 后置通知
    • 在方法执行后执行 可以打印返回的数据 判断数据是否是自己需要的或脱敏
    • @param point
      */
      @After("pointCut()")
      public void after(JoinPoint point) {
      if (startTime.get() == null) {
       startTime.set(System.currentTimeMillis());
      
      }
      logger.info("耗时(毫秒):" + (System.currentTimeMillis() - startTime.get()));
      // 清理线程池
      startTime.remove();
      }
      }
相关文章
|
6月前
|
人工智能 Serverless API
一键部署Stable Diffusion教程
本实验使用函数计算免费额度或购套餐包,部署AI绘画Stable Diffusion应用。新老用户可享专属优惠,按指引创建应用、授权并选择地域部署。支持WebUI与API模式,启用镜像加速优化GPU加载。成功后访问域名进入操作界面,预置提示词助你快速生成首张图像。(239字)
230 0
|
6月前
|
Java 数据库 Sentinel
服务保护、分布式事务
本课程深入讲解微服务保护与分布式事务控制。内容涵盖:微服务雪崩问题及熔断、降级、限流、线程隔离等防护机制;基于Sentinel实现熔断降级与流量控制;掌握FallbackFactory与@SentinelResource注解的使用;理解CAP原理与分布式事务场景;通过Seata实现AT模式分布式事务,保障系统高可用与数据一致性。(238字)
|
6月前
|
JSON Java fastjson
Spring Boot返回Json数据及数据封装
Spring Boot默认使用Jackson处理JSON,通过@RestController可直接返回JSON数据。本文详解Jackson与FastJson的配置与对比,并封装统一的JSON返回结构,提升前后端交互规范性与开发效率。
|
6月前
|
Java Spring
Spring Boot开发环境搭建和项目启动
图片展示了一幅色彩斑斓的抽象艺术画作,流动的线条与绚丽的色块交织,营造出梦幻般的视觉效果,仿佛宇宙星河或意识流的具象化表达,引人遐想。
|
6月前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,帮助用户全面掌握SQL使用情况,提升日志分析效率与治理能力。
|
6月前
|
自然语言处理 搜索推荐 Java
 ES分布式搜索引擎入门
本课程介绍Elasticsearch全文搜索引擎,涵盖倒排索引原理、IK分词器使用与词典扩展、Java Client实现文档增删改查及批量导入,掌握Term查询、全文检索、排序分页与布尔查询,助力高效搜索功能开发。
|
6月前
|
运维 Devops 开发工具
生产环境缺陷管理
git-poison基于go-git实现分布式bug追溯,解决多分支开发中bug漏修、漏发问题。通过“投毒-解毒-银针”机制,自动卡点发布流程,精准识别未修复bug,降低协同成本,避免人为失误,已在大型团队落地一年,有效阻塞带毒版本上线,提升发布安全性与效率。
|
6月前
|
消息中间件 SQL Java
异步消息组件MQ高级
本课程聚焦MQ消息可靠性,涵盖生产者重试与确认机制、消费者确认、消息持久化、幂等性及延迟消息等核心方案,重点讲解如何通过Confirm/Return回调、失败消息表、定时重发等手段保障消息不丢失,实现订单超时自动取消等功能,确保分布式系统数据最终一致。
|
6月前
|
消息中间件 存储 Kafka
 异步消息组件MQ基础
本课程介绍MQ的应用场景及RabbitMQ入门,涵盖同步与异步调用区别、RabbitMQ收发消息、多种交换机特性、队列特性与消息堆积解决方案,并结合商城项目实践,帮助掌握消息中间件核心技能。
|
6月前
|
Docker 容器
容器引擎Docker
容器引擎Docker