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

简介: 该类基于Spring AOP实现请求参数的前置拦截与日志记录,自动捕获Controller层请求的URL、方式、参数及响应方法,并记录执行耗时,便于调试与监控,支持后续扩展如数据脱敏或存储。

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<Long> 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月前
|
消息中间件 Java 数据安全/隐私保护
RabbitMQ集群部署
本文介绍RabbitMQ集群部署,包括普通模式与高可用方案。首先通过Docker搭建三节点集群,配置Erlang Cookie和rabbitmq.conf实现节点通信;接着演示队列创建、数据共享及宕机测试,发现普通模式无高可用能力;进而引入镜像模式,通过策略设置实现队列多副本,支持主从切换;最后重点介绍3.8版本后推荐的仲裁队列,其具备自动选举、强一致性等优势,配置更简便,是实现高可用的首选方案。
RabbitMQ集群部署
|
4月前
|
缓存 Java 数据库连接
MyBatis常见配置
本文介绍 MyBatis 核心配置与多环境管理,涵盖属性加载优先级(方法参数 &gt; resource/url &gt; properties 元素)、关键配置项如缓存、延迟加载、执行器类型等,并详解 environments 环境配置及事务管理机制(JDBC 与 MANAGED),适用于多数据源场景。
|
4月前
|
运维 Devops 开发工具
生产环境缺陷管理
针对大型团队中多分支开发导致的bug管理难题,本文介绍基于go-git实现的通用化工具git-poison。通过“投毒-解毒-银针”机制,实现bug的分布式追溯与自动化卡点,有效避免漏修复、漏发布等问题,降低协同成本,提升发布安全性与效率。
 生产环境缺陷管理
|
4月前
|
存储 NoSQL 关系型数据库
MongoDB相关概念
MongoDB是一款高性能、无模式的文档型NoSQL数据库,适用于高并发、海量数据、高扩展性及高可用性场景。其基于BSON格式存储,支持嵌入式数据模型、丰富查询、索引优化和分片集群,广泛应用于社交、游戏、物联网等领域,尤其适合数据量大、读写频繁、事务要求不高的应用。
|
4月前
|
NoSQL Java 测试技术
MongoDB实战演练
本文介绍某头条文章评论系统的设计与实现,基于MongoDB和SpringDataMongoDB构建微服务。内容涵盖需求分析、表结构设计、技术选型、实体类编写及增删改查功能开发,并实现按文章ID查询评论、分页查询子评论、评论点赞等功能,重点利用MongoTemplate提升点赞操作效率。
MongoDB实战演练
|
4月前
|
JSON Java 数据格式
SpringBoot使用汇总
本节课主要系统的讲解了 Spring Boot 集成 MyBatis 的过程,分为基于 xml 形式和基于注解的形式来讲解,通过实际配置手把手讲解了 Spring Boot 中 MyBatis 的使用方式,并针对注解方式,讲解了常见的问题已经解决方式,有很强的实战意义。在实际项目中,建议根据实际情况来确定使用哪种方式,一般 xml 和注解都在用。
|
4月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,泛型信息被移除,仅保留原始类型(如Object或限定类型)。擦除后,List&lt;String&gt;和List&lt;Integer&gt;均变为List,导致getClass()相等;反射可绕过泛型限制,证明类型检查基于引用而非对象。静态成员不能使用类的泛型参数,因泛型实例化依赖对象创建,而静态上下文无此支持。
|
4月前
|
NoSQL Linux Shell
MongoDB单机部署
本教程介绍MongoDB在Windows和Linux系统中的安装与启动方法,包括下载、解压、配置文件设置及服务启停操作,同时涵盖Shell连接、图形化工具Compass使用,以及版本选择与常见问题处理。
|
4月前
|
存储 JSON NoSQL
MongoDB常用命令
本文介绍MongoDB数据库操作,包括创建与删除数据库、集合的显式与隐式创建、文档的增删改查及分页排序查询。以文章评论数据存储为例,演示了实际CRUD操作与注意事项。
|
4月前
|
存储 NoSQL 关系型数据库
MongoDB索引知识
MongoDB索引基于B树结构,提升查询效率,避免全集合扫描。支持单字段、复合、地理空间、文本及哈希索引,优化相等匹配、范围查询与排序操作,显著提升大数据量下的查询性能。