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

简介: 该类基于Spring AOP实现请求参数日志拦截,通过@Aspect切面记录请求来源、URL、方式、方法及入参,结合@Before、@After与@Around增强,统计接口耗时并输出日志,便于调试与监控,适用于Controller层统一日志处理。(238字)

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();
      }
      }
相关文章
|
3月前
|
人工智能 自然语言处理 安全
AI心理咨询机器人技术解析:安全机制、适用边界与选型指南
深夜失眠、压力难解时,AI心理咨询正成为新选择。2024年全球市场规模达552亿美元,中国情感陪伴市场年增速高达148.74%。本文解析AI心理机器人的技术架构、安全边界与适用场景,揭示专业平台如何通过CBT干预、多模态情绪识别和危机预警保障用户安全,助你理性选择可靠工具。
|
Ubuntu
ubuntu 22.04 阿里源
ubuntu 22.04 阿里源
16229 0
|
6月前
|
机器学习/深度学习 算法 搜索推荐
京东图片识别搜索API,搜索相似商品用于多模态数据训练
京东图片识别搜索API(拍立淘)基于深度学习,通过CNN提取图像特征,结合近似最近邻算法实现以图搜图。支持图片URL/Base64输入,返回结构化商品信息,具备多维度筛选与智能排序功能,提升视觉购物体验。(238字)
|
数据可视化 前端开发 Java
Python3+ Django3:自动生成Swagger接口文档
Python3+ Django3:自动生成Swagger接口文档
1602 0
Python3+ Django3:自动生成Swagger接口文档
|
Ubuntu
ubuntu 换源 阿里源
ubuntu 换源 阿里源
2131 0
如何用deepseek快速做PPT
如何用DeepSeek快速自动制作PPT?只需1分钟!首先,打开DeepSeek输入需求,包括身份、目的和具体要求。复制生成的内容,然后在Kimi中选择“PPT助手”,粘贴内容并点击“一键生成PPT”,选择模板。等待生成后下载PPT。免费工具,专业质量,轻松让你的PPT脱颖而出!快来试试吧!
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
298 0
|
应用服务中间件 Linux nginx
Linux虚拟机磁盘扩容、Docker容器磁盘满的问题、Docker安装nginx
这篇文章讨论了Linux虚拟机磁盘扩容的方法,包括外部配置、具体扩容步骤和扩容后的效果验证。同时,文章还涉及了Docker容器磁盘满的问题及其解决方法,如删除不必要的镜像和容器,以及调整Docker的安装路径。此外,还提到了意外情况的处理,例如误删除停止的容器后的应对措施。最后,文章还提供了使用Docker安装nginx的步骤和成功访问的截图。
Linux虚拟机磁盘扩容、Docker容器磁盘满的问题、Docker安装nginx

热门文章

最新文章