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();
      }
      }
相关文章
|
9月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2463 35
|
6月前
|
JSON Java 编译器
Protobuf 是什么?一篇文章搞懂这个高性能序列化神器
Protobuf是Google开源的高效二进制序列化协议,体积小、速度快,支持跨语言、向后兼容。相比JSON,更适合RPC等高性能场景,广泛应用于微服务通信。通过`.proto`文件定义结构,自动生成代码,实现数据的快速序列化与反序列化。
2636 158
|
7月前
|
消息中间件 Shell Linux
RabbitMQ部署指南
本文介绍RabbitMQ在CentOS7下基于Docker的单机与集群部署方案,涵盖镜像安装、DelayExchange插件配置、普通模式与镜像模式集群搭建,并详解仲裁队列使用及集群扩容方法,助力实现高可用消息队列服务。
|
12月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
567 0
|
7月前
|
关系型数据库 应用服务中间件 Nacos
Nacos配置中心
本章详解Nacos配置中心实战:实现微服务配置统一管理,支持热更新、配置共享与优先级控制,并搭建高可用集群,提升系统稳定性。
|
7月前
|
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字)
|
7月前
|
负载均衡 Java Nacos
Gateway服务网关
网关是微服务的统一入口,实现请求路由、权限控制与限流。基于Spring Cloud Gateway可快速搭建高性能网关,支持断言与过滤器灵活配置,并解决跨域问题,提升系统安全性和可维护性。
|
7月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
MyBatisPlus是MyBatis的增强框架,简化单表CRUD操作,内置分页、条件构造器、代码生成等功能,支持逻辑删除、枚举处理与JSON字段映射,提升开发效率。
|
7月前
|
存储 监控 Java
整合切面,参数拦截+过滤
该类基于Spring AOP实现请求参数日志记录,通过@Aspect切面拦截Controller层入参,记录请求来源、URL、方式、方法及参数,并统计执行耗时,便于调试与监控,日志通过LogProxy输出,支持后续扩展存储或分析。
|
人工智能 自然语言处理
通义灵码在Visual Studio2022中的实践
本文介绍了如何在Visual Studio 2022中安装和使用通义灵码。首先,在Visual Studio 2022中安装通义灵码插件,然后按照步骤完成安装和登录。最后,通过实操演示了通义灵码的三大功能:行级/函数级实时续写、自然语言生成代码和研发领域自由问答。希望读者能从中受益。
7621 4