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();

   }

}

目录
相关文章
|
10月前
|
开发者
业务架构图
本文介绍了业务架构图的核心概念与绘制方法,涵盖业务定义、架构域分类,强调业务架构是技术、应用与数据架构的基础。通过分层、分模块、分功能三步法,梳理业务逻辑,明确模块边界与信息流,提升客户理解与开发效率。
234 0
 业务架构图
|
10月前
|
NoSQL Linux Shell
2-MongoDB单机部署
本文介绍了MongoDB在Windows和Linux系统下的安装、配置与启动方法,包括下载地址、版本选择、解压安装、命令行及配置文件启动方式,并详细说明了如何通过Shell和图形化工具Compass连接数据库。同时提供常见问题解决方案及附件中的各环境安装包链接,便于快速部署使用。
218 0
|
10月前
|
存储 NoSQL 关系型数据库
1-MongoDB相关概念
MongoDB是一款高性能、无模式的文档型NoSQL数据库,适用于高并发、海量数据、高可用性场景。其灵活的BSON文档模型、丰富的查询支持及水平扩展能力,广泛应用于社交、游戏、物联网等领域,尤其适合非事务性、快速迭代的应用系统。
173 0
 1-MongoDB相关概念
|
10月前
|
NoSQL Java 测试技术
5-MongoDB实战演练
本文介绍某头条文章评论功能的设计与实现,基于SpringDataMongoDB构建微服务,完成评论的增删改查、按文章ID查询、分页查询及点赞功能。通过MongoTemplate优化点赞操作,提升性能,并使用索引提高查询效率,整体方案高效且可扩展。
361 0
 5-MongoDB实战演练
|
10月前
|
存储 NoSQL 关系型数据库
4-MongoDB索引知识
MongoDB索引基于B树结构,可高效支持查询,避免全集合扫描。主要类型包括单字段索引、复合索引、地理空间索引、文本索引和哈希索引,适用于不同查询场景,显著提升查询性能。
1090 0
 4-MongoDB索引知识
|
10月前
|
安全 Java 数据安全/隐私保护
2.通用权限管理模型
本文介绍了ACL和RBAC两种常见的权限模型。ACL通过直接为用户或角色授权实现访问控制,简单直观;RBAC则基于角色分配权限,解耦用户与权限关系,更易维护。文中还详解RBAC0-3的演进,涵盖角色继承、职责分离等核心概念,帮助构建系统化权限认知。
228 0
 2.通用权限管理模型
|
10月前
|
Java 关系型数据库 开发工具
自救手册
本文档为新员工入职指南,涵盖首日工作流程:账号开通、开发环境配置(JDK、Maven、IDEA)、代码拉取与Git操作、常用中间件访问及故障排查。包含Nacos、MySQL、Redis等连接配置,Git常用命令与冲突解决,并介绍如何构建二方包和搭建Spring Boot工程,助力快速上手项目开发。
906 0
 自救手册
|
10月前
|
存储 安全 Java
6.鉴权
本文介绍基于Spring Security与JWT的客户端Token认证方案,涵盖实现思路、核心代码及完整流程。通过自定义过滤器与认证逻辑,结合RBAC权限模型,实现安全的Token生成、校验与访问控制,保护Spring Boot应用接口。
228 0
 6.鉴权
|
10月前
|
Java
jvm中类加载的常见加载顺序
本示例展示了Java中各类代码块的执行顺序:静态代码块随类加载执行且仅一次,优先于主函数;局部代码块在方法内按顺序执行;构造代码块每次创建对象时执行,早于构造器。输出结果体现其执行优先级。
148 0
|
10月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,所有泛型信息被移除,仅保留原始类型(如Object或限定类型)。例如,List&lt;String&gt;和List&lt;Integer&gt;在运行时均为List。类型检查在编译期完成,针对引用而非对象本身。擦除后通过桥方法解决多态冲突,并自动插入强制转换。静态成员不能使用类的泛型参数,基本类型需用包装类。
149 0

热门文章

最新文章