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

简介: 该类基于Spring AOP实现请求参数日志拦截,自动记录Web层请求来源、URL、方式、方法及入参,并统计接口耗时。通过`@Before`、`@Around`、`@After`注解实现前置、环绕、后置通知,结合`ThreadLocal`计算执行时间,便于调试与监控,日志统一输出至指定文件,提升系统可观测性。(238字)

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

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();
      }
      }
相关文章
|
4月前
|
NoSQL Java MongoDB
ongoDB实战演练
本项目实现头条文章评论功能,基于SpringDataMongoDB操作MongoDB数据库,支持评论的增删改查、按文章ID查询及点赞功能。构建article微服务模块,设计Comment实体类,封装评论信息,集成mongodb-driver驱动,完成持久化操作。
|
9月前
|
弹性计算 定位技术 数据安全/隐私保护
3分钟部署mc我的世界联机服务器教程——阿里云游戏服务器
我的世界是一款沙盒游戏,玩家可在三维空间中自由创造与探索。阿里云推出一键部署镜像服务,支持快速搭建游戏服务器。提供多种配置选择,包括4核16G和8核32G,费用分别为89元和160元每月,助力玩家轻松畅玩。
|
4月前
|
前端开发 安全 Java
自定义认证前端页面
简介:本文介绍前后端集成Spring Security的登录认证实现。前端包含login.html登录页面;后端通过配置HttpSecurity实现权限控制,包括表单登录、认证流程及CSRF关闭等。启动后访问/index自动跳转至登录页,输入user及控制台密码即可登录成功获取接口数据。(238字)
|
4月前
|
存储 JSON NoSQL
MongoDB常用命令
本案例介绍如何使用MongoDB存储文章评论数据。通过`use articledb`创建并切换数据库,利用`db.createCollection()`显式或插入文档时隐式创建集合。文档以BSON格式存储,使用`insert()`方法添加数据,如评论内容、用户信息等。支持查看数据库与集合、删除操作,并遵循命名规范。适用于掌握MongoDB基本CRUD操作。(238字)
|
4月前
|
缓存 Java 数据库连接
.常见配置
本文介绍MyBatis核心配置,包括属性加载优先级(方法参数 &gt; resource/url &gt; properties内部)、常用配置项如缓存、延迟加载、执行器类型等,多环境配置方式及事务管理机制(JDBC与MANAGED),适用于多数据源场景,结合Spring时无需额外配置事务管理。
|
4月前
|
SQL Java 关系型数据库
分页
简介:分页实现方式多样,包括MyBatis自带的RowBounds内存分页、PageHelper插件自动适配数据库的物理分页、原生SQL分页、数组subList分页及拦截器分页。物理分页适用于大数据量,效率高;逻辑分页适用于小数据量,内存开销大。推荐优先使用物理分页。
|
4月前
|
XML Java 数据库连接
映射关系
简介:MyBatis中通过resultMap实现关联映射。一对一使用`&lt;association&gt;`,一对多在一方添加`List`并用`&lt;collection&gt;`标签,多对一同样用`&lt;association&gt;`关联对象,多对多则借助中间类,双方通过`&lt;collection&gt;`映射集合,解决字段与属性不一致问题。(238字)
|
4月前
|
缓存 Java 数据库连接
汇总
本文介绍MyBatis核心配置与映射规则,涵盖属性加载优先级、常见配置项、多环境数据源设置及事务管理机制,并详解XML中一对一、一对多、多对一关系的映射实现方式,助力高效开发。
|
4月前
|
XML Java 数据格式
@Configuration
被 `@Configuration` 标注的类视为Spring配置类,等同于XML配置文件。通过 `@Bean` 可定义Bean,替代XML中的 `&lt;bean&gt;` 标签。结合 `AnnotationConfigApplicationContext` 可启动IOC容器,加载并管理配置类及其中的Bean实例。
|
4月前
|
安全 Java 微服务
SpringBoot使用汇总
本课程全面讲解Spring Boot 2.0.3核心知识,涵盖配置、MVC、持久化、安全认证、缓存等实用技术,助你快速掌握微服务开发。通过真实项目场景与案例,零基础也能轻松上手,适合Java开发者及微服务学习者。

热门文章

最新文章