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

简介: 该类基于Spring AOP实现请求参数日志记录,通过@Aspect切面拦截Controller层请求,记录请求来源、URL、方式、方法及入参,并统计执行时间,便于调试与监控,日志通过SLF4J输出,支持后续扩展存储。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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 {
相关文章
|
1天前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,帮助用户全面掌握SQL使用情况,实现精细化管理与性能优化,提升日志分析效率与体验。
|
1天前
|
存储 JSON NoSQL
数据库操作
本教程介绍如何使用MongoDB存储文章评论数据,涵盖数据库与集合的创建、删除,文档的增删改查、条件查询、分页及排序操作,重点讲解实际应用中的语法与注意事项,助力快速掌握MongoDB基本操作。
|
1天前
|
运维 Devops 开发工具
生产环境缺陷管理
针对大型团队Git多分支开发中bug协同难、易遗漏等问题,我们基于go-git打造了通用型工具git-poison,实现分布式、自动化bug追溯与管理。通过“投毒-解毒-银针”机制,精准阻塞带缺陷版本发布,避免因沟通疏漏导致的生产故障。已集成至发布与运维平台,显著降低协作成本,提升发布安全性与效率。
|
1天前
|
Java 测试技术 Linux
生产环境发布管理
本文介绍大型团队如何通过自动化部署平台实现多环境(dev→test→pre→prod)高效发布,涵盖各环境职责、基于Jenkins+K8S的CI/CD流程、分支管理与热更新机制,并结合Skywalking日志链路追踪快速定位问题,提升发布效率与系统稳定性。
|
1天前
|
敏捷开发 Dubbo Java
需求开发人日评估
随着敏捷开发普及,人日评估成关键环节。本文详解开发、自测、联调、测试及发布各阶段工时分配,提供常见需求如增删改查、接口调用等的人日参考,并强调并行需求下的调整策略,助力团队精准估算工期,提升协作效率。(238字)
|
1天前
|
敏捷开发 Java 测试技术
为什么要单元测试
单元测试看似“踩刹车”,实则让开发跑得更快。它提升代码质量、降低维护成本,是高效研发的基石。从谷歌到微软,行业实践证明:充分的单元测试能加速迭代、增强信心,助力软件从“爬行”迈向“奔跑”。
|
1天前
|
Java 数据库 Spring
关键的类
通过自定义`@Log`注解标记需记录日志的方法,结合AOP切面`LogAspect`拦截并解析注解,提取操作信息。利用`AsyncManager`异步执行由`AsyncFactory`创建的日志任务,通过线程池配置实现高效、非阻塞的日志持久化处理,提升系统性能与响应速度。(238字)
|
1天前
|
前端开发 搜索推荐 测试技术
背景图变换
本文介绍如何基于若依(RuoYi)框架定制化项目:更换浏览器标签logo、系统页面logo与标题、登录页名称及背景图,去除官网标识,并调整主题风格。通过替换静态资源、修改配置文件及全局搜索删除冗余链接,实现项目个性化展示,提升品牌辨识度,适用于前端界面定制开发场景。(238字)
|
1天前
|
Linux 网络安全 数据安全/隐私保护
虚拟机
挂载CentOS 7虚拟机镜像,设置NAT网络为192.168.100.0网段,并配置虚拟机使用该模式。启动后通过FinalShell等工具使用IP 192.168.100.168、用户名root、密码1234连接,防火墙已关闭,可直接访问。
|
1天前
|
JSON Java 数据格式
不定参数入参
支持非JSON和JSON两种入参方式:非JSON通过@RequestParam或@RequestBody接收基础类型参数;JSON入参可使用JSONObject接收单个或多个参数,或通过@RequestBody封装对象接收并支持@Valid校验,提升代码规范性与可维护性。(239字)