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

简介: 该Java类基于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();

   }

}

相关文章
|
2月前
|
Java 数据库连接 mybatis
MyBatis映射关系(1-1 1-n n-n)
本文介绍了MyBatis中四种核心映射关系:一对一、一对多、多对一、多对多。通过resultMap实现属性与字段的映射,解决命名不一致问题;一对多使用`&lt;collection&gt;`,多对一使用`&lt;association&gt;`,多对多则借助中间类关联双方集合,实现复杂数据结构的封装与查询。
|
2月前
|
Java 关系型数据库 开发工具
自救手册
本文档为新员工入职指南,涵盖首日工作流程:账号开通、开发环境配置(JDK、Maven、IDEA)、代码拉取与Git操作、常用中间件访问及故障排查。包含Nacos、MySQL、Redis等连接配置,Git常用命令与冲突解决,并介绍如何构建二方包和搭建Spring Boot工程,助力快速上手项目开发。
 自救手册
|
2月前
|
NoSQL Java 测试技术
5-MongoDB实战演练
本文介绍某头条文章评论功能的设计与实现,基于SpringDataMongoDB构建微服务,完成评论的增删改查、按文章ID查询、分页查询及点赞功能。通过MongoTemplate优化点赞操作,提升性能,并使用索引提高查询效率,整体方案高效且可扩展。
 5-MongoDB实战演练
|
2月前
|
存储 NoSQL 关系型数据库
4-MongoDB索引知识
MongoDB索引基于B树结构,可高效支持查询,避免全集合扫描。主要类型包括单字段索引、复合索引、地理空间索引、文本索引和哈希索引,适用于不同查询场景,显著提升查询性能。
 4-MongoDB索引知识
|
2月前
|
存储 JSON NoSQL
3-MongoDB常用命令
本文介绍MongoDB数据库操作,包括创建和删除数据库、集合的显式与隐式创建及删除,以及文档的增删改查。重点讲解文章评论数据存储至articledb库中的实际应用,涵盖批量插入、条件查询、分页排序等常用操作,帮助掌握MongoDB基本CRUD技能。
 3-MongoDB常用命令
|
2月前
|
存储 NoSQL 关系型数据库
1-MongoDB相关概念
MongoDB是一款高性能、无模式的文档型NoSQL数据库,适用于高并发、海量数据、高可用性场景。其灵活的BSON文档模型、丰富的查询支持及水平扩展能力,广泛应用于社交、游戏、物联网等领域,尤其适合非事务性、快速迭代的应用系统。
 1-MongoDB相关概念
|
2月前
|
缓存 算法 Java
IO/线程 线程池
本文深入剖析Java线程池的工作原理,涵盖ThreadPoolExecutor与ScheduledThreadPoolExecutor的实现机制。通过源码分析,详解线程池如何管理线程生命周期、任务调度策略及延时队列等核心组件,并结合Executors工具类说明各类线程池的应用场景。
|
2月前
|
Java 应用服务中间件 网络安全
Java基础 Eclipse运行SSM/SSH项目教程
本文介绍了Eclipse环境下Java Web项目的运行与配置流程,涵盖JDK、Tomcat等基础软件安装,项目导入及服务器绑定方法,并提供SSH/SSM框架案例与常见错误解决方案。
Java基础 Eclipse运行SSM/SSH项目教程
|
2月前
|
XML Java 数据格式
SpringBoot @Configuration
`@Configuration` 注解用于标记配置类,相当于 XML 配置文件,可定义 Bean 并由 Spring IOC 容器管理。配合 `@Bean` 注解注册组件,通过注解方式启动容器即可加载配置类及其中的 Bean。
|
2月前
|
SQL 缓存 Java
MyBatis 汇总
本文介绍了MyBatis的核心配置与使用技巧,涵盖属性加载优先级、多环境配置、事务管理、XML映射(一对一、一对多、多对多)、分页实现方式(逻辑与物理分页)及缓存机制,并简要分析了执行器类型与批量操作原理,助力高效开发。