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

简介: 该类基于Spring AOP实现请求参数日志拦截,通过@Aspect切面记录Web层请求信息。自动捕获请求来源、URL、方式、方法及入参,并计算处理耗时,便于调试与监控,日志通过LogProxy输出,支持后续扩展至数据库或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();
      }
      }
相关文章
|
4天前
|
存储 缓存 算法
零拷贝
实现高效文件传输需减少上下文切换与内存拷贝。传统方式频繁系统调用导致性能低下,零拷贝技术通过合并读写操作、利用PageCache和SG-DMA,实现内核态直接传输,显著提升效率。大文件场景可结合异步IO与直接IO优化性能。
|
4天前
|
Java 数据库连接 mybatis
2.映射关系(1-1 1-n n-n)
MyBatis中通过resultMap实现关联映射:一对一处理属性与字段映射;一对多用`&lt;collection&gt;`映射集合,如用户对应多个角色;多对一用`&lt;association&gt;`,如博客关联作者;多对多借助中间类,双向使用`&lt;collection&gt;`实现,如用户与部门的多对多关系。
|
4天前
|
Java 数据安全/隐私保护 开发者
常见加载顺序
本文通过代码示例讲解Java中各类代码块的执行顺序:静态代码块随类加载仅执行一次,优先于主函数;接着是局部代码块,最后是构造代码块与构造器的结合使用。通过实例输出结果清晰展示其执行流程,帮助开发者快速掌握初始化机制。
|
4天前
|
Java 应用服务中间件 网络安全
Eclipse运行SSM/SSH项目教程
本教程介绍如何在Eclipse中配置Java Web项目并运行。涵盖JDK、Tomcat环境搭建,项目导入与Maven配置,Eclipse中绑定服务器及启动访问步骤。附常见问题如数据库连接修改说明,助你快速部署运行项目。(238字)
|
2天前
|
Java 测试技术 API
从Google线上故障,谈灰度发布的重要性
2025年6月12日,Google Cloud因未灰度发布新配置导致全球服务中断7小时。本文分析故障根因,强调配置灰度发布重要性,并详解基于Nacos的IP与标签灰度实现方案,助力企业提升系统稳定性,防范类似风险。
|
2天前
|
监控 Java 测试技术
OOM排查之路:一次曲折的线上故障复盘
本文详述了一次线上服务因Paimon数据湖与RocksDB集成引发的三次内存溢出(OOM)故障排查全过程。从线程暴增到堆外内存泄漏,团队历经曲折,结合MAT、NMT、async-profiler等工具,最终定位至RocksDB通过JNI申请却未释放内存的根源问题。文章系统梳理了排查思路与工具使用,并总结出保留现场、分步分析、善用专家支持等实用经验,为同类技术栈问题提供宝贵借鉴。(238字)
|
2天前
|
存储 缓存 监控
EFC&CTO:缓存引发数据不一致问题排查与深度解析
EFC客户端更新缓存架构后,CTO测试出现data mismatch。排查发现因版本号回退,缓存读取旧NULL数据致pagecache污染,脏页回刷破坏文件系统。修复版本号递增机制后问题解决,期间深入理解了buffer写、setattr触发等内核行为差异。
|
2天前
|
消息中间件 监控 Java
RocketMQ:底层Netty频繁OS OOM
本文记录了一例Java应用因多ClassLoader加载多个Netty堆外内存分配器导致OS OOM的排查过程。虽设MaxDirectMemorySize为1G,但多个中间件独立使用PooledByteBufAllocator,各自绕过JVM直接内存限制,累计超用近1.5G。通过NMT、Arthas等工具定位到RocketMQ等组件占用过高,最终建议调低堆内存以保障堆外空间,并推动中间件优化。
|
2天前
|
存储 运维 NoSQL
Redis:内存陡增100%深度复盘
一次Redis崩溃事故复盘:因大KEY导致带宽占满,触发缓冲区激增,内存被耗尽。虽有淘汰策略,但仅作用于数据内存,缓冲区内存无限制,最终引发全面超时。根源在于网络与存储资源设计失衡,暴露了缓冲区管理盲区。
|
2天前
|
消息中间件 物联网 测试技术
语音通知
适用于科技公司服务器或物联网设备异常时的语音告警场景。开通语音服务后,可申请资质、话术、号码及模板,通过API调用实现自动拨打电话通知告警人,支持变量替换与多模式配置,并可通过控制台或API查询呼叫记录,推荐使用消息回执接收结果。