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

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

   }

}

相关文章
|
6月前
|
移动开发 API 开发者
网站集成微信登录Api接口,所踩的坑
本文总结微信登录接口开发的两大场景(微信内H5与PC端扫码)及配置要点:公众号平台配移动端二级域名(如mobile.domain.com),开放平台配PC端一级域名(如domain.com);强调redirect_uri须带http://且URL编码,避免常见报错。
844 2
|
8月前
|
存储 监控 固态存储
机械硬盘的好处有哪些?为什么现在仍然有大量用户在使用 HDD
在SSD普及的今天,机械硬盘(HDD)并未过时:它以更低的单位容量成本、更优的长期冷存储稳定性、无擦写寿命限制、更高的数据恢复成功率、成熟的大容量技术及良好功耗表现,持续胜任NAS、监控、备份、归档等核心场景。SSD主攻速度,HDD专注容量与可靠,二者协同才是理性存储方案。(239字)
|
4月前
|
缓存 监控 算法
手把手教你IP风险识别:用IP离线库搭建实时风控规则(附代码)
本文分享基于IP数据云离线库构建高性能本地风控系统的实践:通过内存映射(mmap)+二分查找实现微秒级IP风险查询,摆脱外网依赖;支持代理、数据中心、异常地域等毫秒级识别,并融合多层规则引擎与自适应评分模型,显著提升风控实时性、稳定性与准确率。(239字)
323 1
手把手教你IP风险识别:用IP离线库搭建实时风控规则(附代码)
|
9月前
|
消息中间件 Java 数据安全/隐私保护
RabbitMQ集群部署
本文介绍RabbitMQ集群部署,包括普通模式与高可用方案。首先通过Docker搭建三节点集群,配置Erlang Cookie和rabbitmq.conf实现节点通信;接着演示队列创建、数据共享及宕机测试,发现普通模式无高可用能力;进而引入镜像模式,通过策略设置实现队列多副本,支持主从切换;最后重点介绍3.8版本后推荐的仲裁队列,其具备自动选举、强一致性等优势,配置更简便,是实现高可用的首选方案。
RabbitMQ集群部署
|
7月前
|
弹性计算 C++
阿里云服务器月租价格2026新版:从入门到高配全系报价
2026年阿里云服务器月租价震撼更新!轻量应用服务器低至3.17元/月(38元/年),ECS经济型e实例8.25元/月起。涵盖2核2G至8核32G多种配置,新老用户享不同优惠,年付最高可享3.4折。官方原价 vs 特价对比清晰,助您省钱上云。(239字)
520 2
|
存储 弹性计算 调度
基于Knative的LLM推理场景弹性伸缩方案
Knative的基于请求弹性配置与大语言模型(LLM)的推理场景高度契合。此外,它的资源降配特性可以显著帮助用户降低成本。本文详细介绍基于 Knative 的 LLM 推理场景弹性伸缩方案。
|
9月前
|
机器学习/深度学习 存储 边缘计算
物联网平台实战:从设备接入到数据分析的端到端架构演进
本文系统阐述物联网平台从设备接入到数据分析的架构演进路径,涵盖多协议接入、边缘计算、实时处理与AI集成等关键技术,分享高并发优化、分层存储、安全认证等实战经验,助力企业构建高效、可扩展的IoT平台,推动数字化转型与智能决策。
|
编解码 网络协议
如何轻松地 rip 3D Blu-ray:详细步骤指南
随着3D电影和家庭影院的普及,越来越多的人希望将3D Blu-ray电影转换为数字文件,以便在多种设备上播放。本文介绍了使用DVDFab、MakeMKV+HandBrake和Leawo Blu-ray Ripper等软件轻松rip 3D Blu-ray的方法,帮助用户享受高质量的3D观影体验。这些工具不仅提供了便捷性和高质量的输出,还能节省存储空间。
1590 9
|
域名解析 网络协议
阿里云如何找回域名,进行添加或删除?
阿里云如何找回域名,进行添加或删除?
|
Ubuntu 关系型数据库 MySQL
Ubuntu系统本地搭建WordPress网站并发布公网实现远程访问
Ubuntu系统本地搭建WordPress网站并发布公网实现远程访问