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

简介: 该类基于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();
      }
      }
相关文章
|
8月前
|
弹性计算 定位技术 数据安全/隐私保护
3分钟部署mc我的世界联机服务器教程——阿里云游戏服务器
我的世界是一款沙盒游戏,玩家可在三维空间中自由创造与探索。阿里云推出一键部署镜像服务,支持快速搭建游戏服务器。提供多种配置选择,包括4核16G和8核32G,费用分别为89元和160元每月,助力玩家轻松畅玩。
|
3月前
|
XML Java 数据格式
打包
项目打包为单一JAR文件,支持配置文件外置。通过`mvn clean package`命令打包,使用`java -jar **.jar`运行(前台或后台),通过`netstat`或`ps`查PID后`kill -9`停止。也可分离JAR依赖与配置,便于管理。
|
3月前
|
Web App开发 安全 JavaScript
跨域处理
跨域指协议、域名、端口不同时的资源请求。浏览器因同源策略限制,默认阻止跨域请求。通过CORS(跨域资源共享)可在服务端设置Access-Control-Allow-Origin等响应头,实现安全跨域。Spring Boot中可通过@CrossOrigin注解或全局配置WebMvcConfigurer实现细粒度跨域控制,支持指定域名、方法、请求头及凭证传递。
|
3月前
|
存储 安全 Java
鉴权
本文介绍基于JWT与Spring Security的客户端Token认证方案。通过HMAC或RSA签名生成Token,结合Spring Boot实现登录鉴权与接口验签。配置WebSecurityConfig安全类,过滤/login请求并生成带过期时间的Token,其余接口通过JWTAuthenticationFilter校验权限,确保系统安全。
|
3月前
|
Java Spring
自动装配机制
@SpringBootApplication是Spring Boot核心注解,为组合注解,包含@Configuration、@ComponentScan、@EnableAutoConfiguration等。其通过@Import导入AutoConfigurationImportSelector和Registrar,实现自动配置类加载与包路径注册,结合元注解实现类扫描与条件过滤,完成自动装配的源码级实现。
|
3月前
|
安全 Java 数据安全/隐私保护
通用权限管理模型
本文介绍了ACL和RBAC两大权限模型。ACL通过用户/角色与权限直接绑定实现控制,简单直观;RBAC则基于角色进行权限管理,解耦用户与权限,支持角色继承与职责分离,更适用于复杂系统。还简要提及DAC、MAC、ABAC等其他模型。
|
3月前
|
安全 Java 应用服务中间件
实现权限管理的技术
权限管理技术选型需综合考量。常见方案如Apache Shiro,轻量易用但安全维护弱;Spring Security功能强大,集成度高但较重;自定义ACL契合业务但理解成本高。多数技术基于ACL或RBAC模型封装,选型应结合项目实际,权衡优劣。
|
3月前
|
安全 Java 应用服务中间件
认识SpringSecurity
Spring Security 是基于过滤器链的鉴权框架,核心功能包括认证(支持表单、OAuth2、JWT等)、鉴权(URL、方法级、RBAC等)及防御CSRF等攻击。通过FilterChainProxy与DelegatingFilterProxy集成到Web容器,实现灵活的安全控制与异常处理。
|
3月前
|
运维 安全 Devops
生产环境缺陷管理
git-poison基于go-git实现分布式bug追溯,解决多分支开发中bug漏修、漏发等协同难题。通过“投毒-解毒-银针”机制,自动化卡点发布流程,降低沟通成本,避免人为失误,已在大型团队落地一年,显著提升发布安全与效率。
|
3月前
|
安全 Java Spring
.过滤器链加载原理
通过前文十五个过滤器的解析,我们了解了Spring Security的工作流程。虽未显式配置,但这些过滤器由DelegatingFilterProxy通过名称springSecurityFilterChain自动加载,最终交由FilterChainProxy执行。其核心是DefaultSecurityFilterChain,封装了所有安全过滤器。底层原理明晰后,方可更好实现自定义认证页面。