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

简介: 该Java类 `RequestParamsAspect` 使用Spring AOP实现请求拦截,记录控制器方法的调用日志,包括请求来源、URL、方式、参数及执行耗时,便于调试与监控,提升系统可观测性。
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<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();
    }
}


相关文章
|
2月前
|
安全 Java 数据安全/隐私保护
通用权限管理模型
本文介绍了ACL和RBAC两种常见权限模型。ACL通过直接为用户或角色授权,实现简单但管理复杂;RBAC基于角色分配权限,支持角色继承与职责分离,更适用于复杂系统。还简要提及DAC、MAC、ABAC等模型,并详解RBAC0-3的演进与核心原则,帮助构建权限体系的全局认知。(238字)
|
2月前
|
前端开发 程序员
常见注解及使用说明
本文介绍SpringMVC中@RequestMapping注解的作用及原理,讲解如何通过注解将HTTP请求映射到控制器方法,并列举@GetMapping等派生注解,帮助理解前后端接口的对应关系与实现方式。
 常见注解及使用说明
|
2月前
|
安全 Java 数据库连接
OAuth2.0实战案例
本文介绍基于Spring Boot与Spring Cloud的OAuth2安全授权实现,涵盖父工程搭建、资源服务与授权服务配置,支持授权码、简化、密码及客户端四种模式测试,结合Security与MyBatis完成认证授权全流程。
OAuth2.0实战案例
|
2月前
|
存储 安全 数据库
RememberMe简介及用法
RememberMe功能并非简单记住用户名密码,而是通过服务端生成持久化令牌(Token),实现用户关闭浏览器后仍保持登录状态。勾选“记住我”后,系统在响应头中设置remember-me Cookie,后续请求自动携带该令牌验证身份。为提升安全性,可将Token存储至数据库并加入二次校验机制,防止因令牌泄露导致的安全风险。
|
2月前
|
存储 安全 Java
认证源码分析与自定义后端认证逻辑
本文深入分析Spring Security认证流程,从UsernamePasswordAuthenticationFilter到AuthenticationManager、ProviderManager,层层剖析认证机制。重点讲解自定义UserDetailsService实现、UserDetails对象封装及权限处理,并结合源码解读认证成功后SecurityContext的存储逻辑与“记住我”功能,最后给出完整自定义认证实现步骤与代码示例。
 认证源码分析与自定义后端认证逻辑
|
2月前
|
安全 Java 开发工具
工程搭建与验证
本文介绍如何使用阿里云脚手架快速搭建SpringBoot工程,并整合SpringSecurity实现基础安全控制。涵盖项目创建、代码导入、Web依赖配置及Security集成验证,提供完整代码仓库与分支。
工程搭建与验证
|
2月前
|
敏捷开发 Java 测试技术
为什么要单元测试
单元测试是保障代码质量的基石,虽看似拖慢进度,实则通过快速反馈、精准定位问题、提升代码可维护性,显著提高研发效率。遵循“测试金字塔”,以单元测试为根基,才能让软件系统更稳定、迭代更敏捷,真正实现高效交付。
为什么要单元测试
|
2月前
|
安全 数据安全/隐私保护
什么是权限管理
本文介绍了权限管理中的两大核心机制:认证与授权。认证用于验证用户身份,确保登录安全;授权则根据角色分配权限,控制用户可访问的资源与操作。二者结合,构建起系统安全的基石,有效防止越权操作与数据泄露,保障应用稳定运行。
|
2月前
|
存储 缓存 Java
自动装配机制
本文深入解析SpringBoot自动装配机制,从@SpringBootApplication注解入手,剖析其组合注解原理。重点讲解@ComponentScan、@SpringBootConfiguration与@EnableAutoConfiguration三大核心注解的源码实现,揭示@AutoConfigurationPackage和AutoConfigurationImportSelector如何通过Spring Factories机制加载配置类,实现自动化配置全过程。
自动装配机制
|
2月前
|
SQL 安全 关系型数据库
了解SQL注入
SQL注入是通过构造恶意SQL语句绕过安全验证,攻击数据库的常见手段,可导致数据泄露、篡改甚至系统被控。需结合输入验证与参数化查询等措施综合防御。