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

简介: 本文介绍如何在Java Spring项目中通过AOP实现切面整合,结合参数拦截与过滤功能。利用`@Before`、`@Around`和`@After`注解,对Controller层请求进行统一日志记录,包括请求来源、URL、方式、参数及执行耗时,并支持后续扩展至数据库存储或ELK日志系统,提升系统可观测性与安全性。(238字)

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

Java

运行代码复制代码

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

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

package cn.zhicall.web.aspect;

public class RequestParamsAspect {


protected final Logger logger = LogProxy.getLogger("REQUEST_PARAM_LOG");

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

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();

}

}



相关文章
|
Java
http访问springboot接口出现401 、403、 Forbidden 错误解决方法
http访问springboot接口出现401 、403、 Forbidden 错误解决方法
4033 0
|
存储 监控 Linux
在 CentOS 7 中如何进行磁盘分区和挂载的最佳实践。
【10月更文挑战第7天】本文详细介绍了在 CentOS 7 中如何进行磁盘分区和挂载的最佳实践。通过合理规划和管理磁盘空间,可以提高系统的稳定性和可维护性。具体步骤包括确认未使用的硬盘、创建分区、格式化分区、创建挂载点、挂载分区以及编辑 `/etc/fstab` 文件实现永久挂载。此外,还分享了备份数据、分区规划、权限设置和监控磁盘使用等最佳实践。这些技能对 IT 专业人员来说至关重要。
1083 3
|
8月前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
本文介绍如何通过四色原型法构建领域模型,并逐步推导出数据架构中的ER图。采用红色(时标性)、绿色(参与方-物品-地点)、黄色(角色)和蓝色(描述)四色模型,结合风控系统案例,详解从业务流程到实体关系图的建模过程,助力精准梳理数据结构。
 领域模型图(数据架构/ER图)
|
8月前
|
JSON 安全 机器人
钉钉通知
本文介绍如何通过Java代码调用钉钉机器人API实现系统告警消息推送。内容涵盖机器人创建、Webhook配置、Postman测试及Java代码实现,并提供限流策略与关键词安全设置等最佳实践,助力实时监控与异常通知。
|
8月前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
机器学习/深度学习 存储 算法
印刷字体识别系统
一个基于Python的印刷字体识别系统,遵循 GNU_GPL_v3 许可,具备字体倾斜校正、行与字符分割及字符识别功能。采用HOG算法训练SVM模型,使用Chars74K数据集。系统包含简单UI,支持动态加载和结果展示。核心算法包括自适应扩展+连通域辅助的行分割,以及垂直投影+连通域+极小值法细分粘连字符的字符分割。项目文件结构清晰,涵盖图像处理、模型训练与加载等功能模块。
428 6
|
8月前
|
算法 安全 5G
uwb超宽带定位技术是什么?如何做到精准定位?从原理到优劣详解
UWB(超宽带)技术通过纳秒级脉冲实现厘米级高精度定位,抗干扰强、安全性高,可同时定位多目标,广泛应用于工厂、医院等场景,助力安全与效率提升,是室内定位的核心技术之一。如果您想进一步了解uwb超宽带技术和案例,欢迎搜索维构lbs智能定位~
|
8月前
|
安全 Java 应用服务中间件
4.认识SpringSecurity
Spring Security 是 Spring 生态中的安全框架,提供认证、授权及安全防护功能。支持多种认证方式(如表单、OAuth2、JWT等),基于过滤器链实现请求控制,可防御 CSRF 等攻击,保障 Web 应用安全。
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
3927 1
|
JavaScript 前端开发
为什么typeof null 是object
为什么typeof null 是object
458 1

热门文章

最新文章