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

简介: 该方法为AOP后置通知,记录目标方法执行耗时。通过ThreadLocal保存起始时间,方法执行后计算并打印耗时(毫秒),最后清理线程局部变量,避免内存泄漏。适用于性能监控场景。

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 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();
      }
      }
相关文章
|
传感器 存储 JSON
|
监控 JavaScript 前端开发
《Linux/UNIX OpenLDAP实战指南》——2.5 OpenLDAP单节点配置案例
LDAP服务端和客户端主机名称及对应的IP地址解析服务正常工作,且每个节点的主机名称需要跟“uname –n”命令执行的结果保持一致。这可以通过搭建DNS服务来完成,也可以通过修改两个节点的hosts文件来保持IP地址和主机名之间,互相解析。
3785 0
|
8月前
|
域名解析 弹性计算 数据可视化
阿里云服务器建站流程:创建ECS、配置网站、域名购买解析及网站上线图文教程
本文详解阿里云ECS与轻量应用服务器建站全流程:从创建实例、配置安全组、部署网站,到域名购买、实名认证、ICP备案及DNS解析,支持搭建企业官网、OA系统、论坛博客等。图文并茂,新手友好。
|
11月前
|
数据采集 存储 JavaScript
爬取多页数据合并为Excel:从入门到精通的实用指南
自动化爬取多页数据并合并至Excel,可高效整合分散信息。结合Python的Requests、BeautifulSoup与OpenPyXL,实现抓取、清洗、存储一体化,提升数据处理效率与分析能力。
835 1
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
9月前
|
传感器 算法 安全
展厅主动迎宾机器人技术深度解析与主流产品应用指南
随着数字化转型,服务机器人在展厅、博物馆等场景中实现主动迎宾与智能交互。本文解析视听融合感知、Agentic RAG问答、社会化导航等核心技术,并对比猎户星空、优必选、普渡科技主流产品,助力精准选型。
|
存储 中间件 数据处理
深入解读 Scrapy 框架原理与源码
深入解读 Scrapy 框架原理与源码
771 1
|
监控 Java 数据库连接
Java一分钟之-JDBC连接池:HikariCP, Apache DBCP, C3P0
【6月更文挑战第14天】本文介绍了Java中常用的三种JDBC连接池——HikariCP、Apache DBCP和C3P0。HikariCP以其高性能和低延迟领先,适合高并发环境;Apache DBCP稳定易配置;C3P0则提供高度可定制选项。文章讨论了各连接池的常见问题及避免策略,如配置不当、连接泄露等,并给出示例代码以供参考。选择合适的连接池并正确配置能有效提升应用性能。
987 7
|
XML JavaScript 前端开发

热门文章

最新文章