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

简介: 该类基于Spring AOP实现Web请求的入参拦截与日志记录,自动捕获请求来源、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();

   }

}

相关文章
|
5月前
|
缓存 JSON JavaScript
TypeScript 快速上手指南
TypeScript是JavaScript的超集,支持静态类型,提升代码质量与可维护性。本文涵盖环境搭建、核心语法、实战示例及工程化配置,零基础也能快速上手,适合Vue3、React等大型项目开发。
|
5月前
|
NoSQL Linux 网络安全
Redis集群部署指南
本章基于CentOS7讲解Redis集群搭建,涵盖单机安装、主从复制、哨兵集群及分片集群的部署与配置,详细演示Redis高可用与分布式架构实践全过程。
|
5月前
|
传感器 算法 机器人
医疗导诊机器人关键技术深度解析
智慧医院建设推动导诊机器人迈向智能化,集成医疗大模型、知识图谱、多传感器融合、情感计算等核心技术,实现精准分诊、厘米级导航、跨楼层协同与人性化交互,正从“迎宾员”转型为医疗流程中枢,助力医疗服务高效化、人性化、安全化发展。
|
5月前
|
Kubernetes 网络协议 容器
【k8s-1.34.2安装部署】七.coredns-v1.13.1安装
本章介绍如何安装并验证coredns-v1.13.1。下载coredns.yaml.base文件,替换镜像地址、DNS域、内存限制及服务IP,应用配置后通过svc和pod验证CoreDNS解析功能是否正常。
547 11
|
5月前
|
数据采集 存储 人工智能
什么是数据治理?企业建设数据治理系统费用全攻略(2025年12月更新)
在数字经济时代,数据治理已成为企业释放数据价值的核心战略。本文深入解析数据治理内涵,聚焦成本、选型与实施路径,对比瓴羊Dataphin、字节Dataleap等主流平台能力,提供2025年最新费用参考与落地建议,助力企业科学决策,实现数据资产化与智能化升级。(238字)
什么是数据治理?企业建设数据治理系统费用全攻略(2025年12月更新)
|
6月前
|
弹性计算
阿里云服务器最便宜多少钱一年?亲测38元一年
阿里云新用户可抢38元/年轻量服务器(2核2G、200M带宽、不限流量),每日10:00、15:00限量抢购;非新用户可选ECS经济型实例,99元/年(2核2G、3M带宽、40G硬盘),续费同价,限一台。
440 5
|
API 开发者
HarmonyOS:ArkTS Path 组件自学指南
在鸿蒙应用开发中,绘制复杂图形常面临传统布局方式难以满足需求的问题。ArkTS 的 Path 组件提供了解决方案,如同一把“神奇画笔”,支持通过灵活的命令和属性绘制直线、曲线、椭圆弧等多样图形。本文详细介绍了 Path 组件从 API Version 7 起的功能特性,包括 `commands`、`fill`、`stroke` 等核心属性,以及各类绘图命令如 `M`(移动)、`L`(直线)、`C`(贝塞尔曲线)等。结合示例代码,展示了如何绘制简单直线到复杂曲线图形,并拓展了颜色、透明度和线条样式的自定义方法。掌握 Path 组件,可为应用带来更丰富生动的视觉体验,助力开发者实现创意绘图需求。
493 21
|
人工智能 API
MCP协议的局限性
5年前,我把 AI 比喻为一种智能化的 API 网关,提出一种分治的思想,将一个大问题转换为若干可解的小问题,如今,这种思想正在 mcp 这种协议沿用。但目前来看,它的实现方式还是有点丑陋的,并且有一些问题。
|
机器学习/深度学习 安全 Linux
Linux 主要应用领域的归纳
服务器领域 Linux在服务器领域的应用是其最为广泛和成熟的领域之一。由于其开源、稳定、高效和安全的特性,Linux成为许多企业服务器的首选操作系统。 Web服务器:Linux是Web服务器的理想选择,因为它支持Apache、Nginx等流行的Web服务器软件,这些软件在Linux上运行稳定且性能卓越。Linux服务器可以高效地处理大量并发请求,提供快速、可靠的Web服务。 数据库服务器:Linux也广泛用于数据库服务器,如MySQL、PostgreSQL和Oracle等数据库管理系统在Linux上运行良好。Linux的稳定性和安全性使得它成为存储和管理敏感数据的理想平台。 邮件服务器:Lin
772 5
|
SQL 存储 监控
obdiag:一款OceanBase 数据库诊断的利器
本次分享的主题是obdiag:一款 OceanBase 数据库诊断的利器,由蚂蚁集团 OceanBase 技术专家汤庆分享。主要分为四个部分: 1. OceanBase 概述 2. Obdiag 项目价值 3. Obdiag 设计与实现 4. Obdiag 未来规划
450 14