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

简介: 该Java代码使用Spring AOP实现控制器请求的切面拦截,记录请求来源、URL、方式、参数及耗时,便于调试与监控。通过Pointcut定义拦截规则,结合Before、After、Around通知实现日志输出与性能统计,支持后续扩展至数据库或ELK存储。

Java

运行代码复制代码

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

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

import org.springframework.stereotype.Component;

//为了记录执行时间 方便调试 如果不需要可以去掉

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月前
|
负载均衡 Java 应用服务中间件
Nacos注册中心
本文介绍了Nacos的安装部署、服务注册与发现、分级模型、负载均衡策略、权重控制、环境隔离及临时/持久化实例等核心功能,涵盖从本地启动到生产级配置的完整实践流程。通过实际操作演示了如何整合Spring Cloud Alibaba实现服务治理,并深入解析其架构设计与应用场景。
 Nacos注册中心
|
5月前
|
XML Java 数据库
SpringCloud工程部署启动
本文介绍SpringCloud微服务工程的搭建与部署,涵盖项目创建、模块配置、数据库导入及服务远程调用实现。通过RestTemplate完成服务间HTTP通信,解决跨服务数据获取问题,并引导读者理解微服务拆分与调用关系,为后续深入学习奠定基础。(239字)
 SpringCloud工程部署启动
|
5月前
|
SQL 容灾 数据库
分布式事务Seata
本章学习分布式事务问题及解决方案,涵盖CAP、BASE理论,并深入讲解Seata框架的XA、AT、TCC、SAGA四种模式原理与实现,掌握跨服务事务一致性处理及高可用部署。
 分布式事务Seata
|
5月前
|
SQL 容灾 Nacos
Seata的部署和集成
本文介绍Seata TC服务器的部署与微服务集成,包括下载、解压、配置修改、数据库表创建及启动步骤,并实现基于Nacos的高可用与异地容灾集群,提升分布式事务可靠性。
|
5月前
|
自然语言处理 Java Shell
安装ES、Kibana、IK
本文介绍了如何通过Docker部署单点Elasticsearch与Kibana,并配置IK分词器。内容涵盖网络创建、镜像加载、容器运行、DevTools使用,以及IK分词器的安装与扩展词典、停用词配置,助力中文文本分析。
 安装ES、Kibana、IK
|
5月前
|
JSON Java Shell
Jmeter快速入门
本文介绍JMeter的安装与快速入门使用方法,包括环境依赖、下载解压、启动运行、中文界面设置及基本测试计划创建,涵盖线程组配置、HTTP请求添加、监听器使用等性能测试核心操作步骤。
 Jmeter快速入门
|
5月前
|
项目管理 开发者
业务架构图
业务架构图是梳理业务层级与关系的工具,通过分层、分模块、分功能,抽象出清晰的业务结构。它既提升客户理解度,也帮助开发者快速掌握系统全貌,实现业务与技术的有效协同。
业务架构图
|
5月前
|
监控 Java 测试技术
微服务保护Sentinel
本课程深入讲解微服务中雪崩问题的成因及解决方案,重点介绍阿里开源流量治理组件Sentinel的应用。涵盖Sentinel的部署与整合、限流模式(直接、关联、链路)、流控效果(快速失败、预热、排队等待)、熔断降级、线程隔离、授权规则及规则持久化等内容,结合Jmeter压测实战,帮助开发者全面提升微服务稳定性与高可用能力。
|
5月前
|
消息中间件 Linux Shell
RabbitMQ部署指南
本文介绍了RabbitMQ在CentOS 7上基于Docker的单机与集群部署方案。内容涵盖镜像安装、DelayExchange插件配置,并详细说明了普通模式与镜像模式集群的搭建及测试方法,重点解析了镜像队列的高可用机制。此外,还引入了3.8版本后推荐的仲裁队列,展示其自动容灾与动态扩容能力,为构建稳定可靠的消息中间件系统提供完整实践指南。(239字符)
 RabbitMQ部署指南
|
5月前
|
消息中间件 存储 Java
消息中间件RabbitMQ(高级)
本文深入探讨RabbitMQ在生产环境中的高级应用,涵盖消息可靠性、延迟消息、消息堆积及集群高可用等核心问题。通过生产者确认、持久化、消费者确认机制确保消息不丢失;利用TTL与死信交换机实现延迟队列;借助惰性队列提升堆积能力;最后通过普通集群、镜像集群及仲裁队列实现高可用架构。
 消息中间件RabbitMQ(高级)