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

简介: 该类基于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();
      }
      }
相关文章
|
10月前
|
运维 Java Nacos
Nacos配置中心
本章基于Nacos实现配置中心,解决微服务架构中配置管理难题。通过引入nacos-config依赖与bootstrap.yaml文件,实现应用启动时优先加载远程配置,动态获取userservice-dev.yaml等环境配置,支持热更新、集中化管理,提升系统可用性与运维效率。
|
10月前
|
Dubbo Java 应用服务中间件
Feign远程调用
本章介绍Feign如何优雅替代RestTemplate实现HTTP跨服务调用。通过引入Feign,结合注解声明远程接口,避免服务地址硬编码,提升代码可读性与维护性,并支持自定义日志、编码等配置,实现高效、简洁的微服务通信方案。
|
10月前
|
存储 数据库
数据库设计三范式
数据库三范式是设计合理表结构的指导原则。第一范式要求字段原子性,不可再分;第二范式要求消除部分依赖,一张表只描述一件事;第三范式要求消除传递依赖,非主键间不能相互决定。虽有助于减少冗余与操作异常,但实际应用中需结合业务权衡,不必机械遵循。
|
10月前
|
SQL 安全 关系型数据库
了解SQL注入
SQL注入是一种通过操控用户输入来篡改数据库查询的攻击方式,可导致身份验证绕过、数据泄露、篡改甚至系统命令执行。其原理是利用Web应用对输入数据过滤不严,将恶意SQL代码注入后端数据库。常见防御措施包括使用参数化查询、预编译语句、严格的输入验证(白名单)以及屏蔽敏感错误信息,从源头上防止攻击者操纵SQL逻辑。
|
10月前
|
缓存 Java 数据库连接
.常见配置
本文介绍MyBatis核心配置,包括属性加载优先级(方法参数 &gt; resource/url &gt; properties内部)、常用配置项如缓存、延迟加载、执行器类型等,多环境配置方式及事务管理机制(JDBC与MANAGED),适用于多数据源场景,结合Spring时无需额外配置事务管理。
|
10月前
|
Java 关系型数据库 MySQL
OAuth2.0实战案例
基于Spring Boot与Spring Cloud构建OAuth2安全认证系统,包含父工程、资源服务与授权服务模块,集成Spring Security、MyBatis及MySQL,实现统一权限管理与安全访问控制。
|
10月前
|
存储 安全 小程序
认识OAuth2.0
OAuth2.0是开放授权标准,允许第三方应用在用户授权下安全访问资源,无需获取用户账号密码。通过令牌机制实现权限控制,支持四种模式:授权码、简化、密码和客户端模式,广泛用于API授权与单点登录场景。
|
10月前
|
存储 安全 前端开发
RememberMe简介及用法
RememberMe功能实现用户关闭浏览器后仍保持登录状态,基于服务端机制而非保存账号密码。通过Cookie存储令牌(remember-me),后续请求自动携带并校验,实现免重复登录。但令牌泄露存在安全风险,可通过持久化Token至数据库并增加二次校验提升安全性,避免非法访问。
|
10月前
|
安全 Java 数据库
认证源码分析与自定义后端认证逻辑
本文深入分析Spring Security认证流程,从UsernamePasswordAuthenticationFilter过滤器入手,解析用户登录请求如何通过AuthenticationManager委托给AuthenticationProvider进行认证,最终由UserDetailsService加载用户信息并完成身份验证的全过程,揭示自定义认证逻辑的关键实现点。
|
10月前
|
前端开发 安全 Java
自定义认证前端页面
简介:本文介绍前后端集成Spring Security的登录认证实现。前端包含login.html登录页面;后端通过配置HttpSecurity实现权限控制,包括表单登录、认证流程及CSRF关闭等。启动后访问/index自动跳转至登录页,输入user及控制台密码即可登录成功获取接口数据。(238字)

热门文章

最新文章