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

简介: 基于Spring AOP实现的请求拦截切面,用于记录Web层入参信息。自动捕获请求来源、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();
      }
      }
相关文章
|
8月前
|
JSON Java 编译器
Protobuf 是什么?一篇文章搞懂这个高性能序列化神器
Protobuf是Google开源的高效二进制序列化协议,体积小、速度快,支持跨语言、向后兼容。相比JSON,更适合RPC等高性能场景,广泛应用于微服务通信。通过`.proto`文件定义结构,自动生成代码,实现数据的快速序列化与反序列化。
3167 158
|
11月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2817 35
|
9月前
|
消息中间件 Shell Linux
RabbitMQ部署指南
本文介绍RabbitMQ在CentOS7下基于Docker的单机与集群部署方案,涵盖镜像安装、DelayExchange插件配置、普通模式与镜像模式集群搭建,并详解仲裁队列使用及集群扩容方法,助力实现高可用消息队列服务。
|
9月前
|
SQL 容灾 Nacos
Seata的部署和集成
本文介绍Seata分布式事务框架的部署与微服务集成。首先下载并解压Seata Server,修改配置文件application.yml,并在Nacos中配置seataServer.properties及数据库信息。创建seata数据库并运行SQL脚本初始化事务表。启动TC服务后,注册至Nacos。各微服务引入Seata依赖,配置application.yml连接TC。为实现高可用,搭建多节点TC集群,通过Nacos统一管理事务组映射,实现异地容灾与动态切换。微服务从Nacos读取client.properties,灵活绑定TC集群,提升系统稳定性与可维护性。(238字)
|
9月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
MyBatisPlus是MyBatis的增强框架,简化单表CRUD操作,内置分页、条件构造器、代码生成等功能,支持逻辑删除、枚举处理与JSON字段映射,提升开发效率。
|
9月前
|
消息中间件 存储 Java
消息中间件RabbitMQ(高级)
本节深入探讨RabbitMQ在生产环境中的高可用与可靠性问题,涵盖消息确认、持久化、消费者重试、死信队列、延迟消息、惰性队列及集群搭建。通过实战案例实现消息不丢失、延迟处理与高并发支撑,全面提升系统稳定性与可扩展性。(239字)
|
9月前
|
负载均衡 Java Nacos
Gateway服务网关
网关是微服务的统一入口,实现请求路由、权限控制与限流。基于Spring Cloud Gateway可快速搭建高性能网关,支持断言与过滤器灵活配置,并解决跨域问题,提升系统安全性和可维护性。
|
9月前
|
关系型数据库 应用服务中间件 Nacos
Nacos配置中心
本章详解Nacos配置中心实战:实现微服务配置统一管理,支持热更新、配置共享与优先级控制,并搭建高可用集群,提升系统稳定性。
|
9月前
|
JSON Java 数据格式
SpringBoot使用汇总
本课程系统讲解Spring Boot核心知识,涵盖环境搭建、JSON数据处理、日志记录、属性配置、MVC支持、异常处理等,结合实战案例与源码解析,助力开发者快速掌握微服务开发技能。
|
9月前
|
存储 监控 Java
整合切面,参数拦截+过滤
该类基于Spring AOP实现请求参数日志记录,通过@Aspect切面拦截Controller层入参,记录请求来源、URL、方式、方法及参数,并统计执行耗时,便于调试与监控,日志通过LogProxy输出,支持后续扩展存储或分析。