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月前
|
人工智能 Java 程序员
突破封装之困:AI时代编程新范式——面向意图编程(Intent-Oriented Programming, IOP)
本文提出“面向意图编程(IOP)”——AI时代的全新软件工程范式。它弱化传统抽象机制,以业务意图为核心资产,由AI在约束下自动生成最优执行代码,并通过版本化与原子变更保障一致性。IOP实现从“写代码”到“定义意图”的根本转变,释放AI效能,重构开发本质。(239字)
|
Ubuntu
ubuntu 22.04 阿里源
ubuntu 22.04 阿里源
16936 0
|
4月前
|
人工智能 自然语言处理 安全
AI心理咨询机器人技术解析:安全机制、适用边界与选型指南
深夜失眠、压力难解时,AI心理咨询正成为新选择。2024年全球市场规模达552亿美元,中国情感陪伴市场年增速高达148.74%。本文解析AI心理机器人的技术架构、安全边界与适用场景,揭示专业平台如何通过CBT干预、多模态情绪识别和危机预警保障用户安全,助你理性选择可靠工具。
|
Ubuntu
ubuntu 换源 阿里源
ubuntu 换源 阿里源
2196 0
|
7月前
|
机器学习/深度学习 算法 搜索推荐
京东图片识别搜索API,搜索相似商品用于多模态数据训练
京东图片识别搜索API(拍立淘)基于深度学习,通过CNN提取图像特征,结合近似最近邻算法实现以图搜图。支持图片URL/Base64输入,返回结构化商品信息,具备多维度筛选与智能排序功能,提升视觉购物体验。(238字)
如何用deepseek快速做PPT
如何用DeepSeek快速自动制作PPT?只需1分钟!首先,打开DeepSeek输入需求,包括身份、目的和具体要求。复制生成的内容,然后在Kimi中选择“PPT助手”,粘贴内容并点击“一键生成PPT”,选择模板。等待生成后下载PPT。免费工具,专业质量,轻松让你的PPT脱颖而出!快来试试吧!
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
305 0
|
安全 关系型数据库 Shell
Web安全-浅析CSV注入漏洞的原理及利用
Web安全-浅析CSV注入漏洞的原理及利用
1151 3