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

简介: 该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();
    }
}


相关文章
|
3月前
|
存储 消息中间件 开发框架
应用架构图
技术架构是将业务需求转化为技术实现的关键过程,涵盖分层设计、技术选型与系统集成。本文详解单体与分布式架构,包括展现层、业务层、数据层及基础层的职责,以及应用间调用关系、外部系统交互与边界划分,为构建清晰的技术体系提供指导。
 应用架构图
|
3月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文介绍如何使用Nacos实现配置中心及集群搭建。涵盖配置管理、热更新、共享配置、优先级规则,并通过Nginx实现高可用集群部署,提升微服务架构下配置的动态管理与系统稳定性。
Nacos配置中心
|
3月前
|
存储 Dubbo API
SpringCloud工程部署启
本文介绍SpringCloud微服务工程的搭建与部署,涵盖项目创建、数据库配置、服务启动及远程调用实现,通过RestTemplate完成服务间通信,帮助理解微服务拆分与协作机制。
SpringCloud工程部署启
|
3月前
|
存储 JSON NoSQL
MongoDB常用命令
本文介绍MongoDB数据库操作,包括创建与删除数据库、集合的显式与隐式创建、文档的增删改查、批量操作、分页查询及排序。以文章评论系统为例,演示数据存储结构及常用命令,涵盖insert、update、remove、find、limit、skip、sort等方法,帮助掌握MongoDB基本使用。
|
3月前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,助力用户全面掌握SQL使用情况,提升日志分析效率与治理能力。
如何做好SQL质量监控
|
3月前
|
存储 缓存 负载均衡
Nacos注册中心
本文介绍Nacos的安装部署、整合注册中心、服务分级模型、负载均衡策略、权重控制、环境隔离及实例类型,涵盖从入门到实战的核心知识点,助力掌握微服务架构中的服务发现与配置管理。
 Nacos注册中心
|
3月前
|
运维 Devops 开发工具
生产环境缺陷管理
git-poison基于go-git实现分布式bug追踪,解决多分支开发中bug漏修、漏发问题。通过“投毒-解毒-银针”机制,自动化卡点发布流程,降低协同成本,提升发布安全性与效率,已在大型团队落地应用。
生产环境缺陷管理
|
3月前
|
负载均衡 算法 架构师
Ribbon负载均衡
本文深入讲解Spring Cloud中Ribbon实现客户端负载均衡的原理,涵盖负载均衡概念、分类、常用算法,详解@LoadBalanced注解作用机制,演示自定义策略与饥饿加载优化,并对比服务端负载均衡,帮助读者全面理解微服务间调用的流量分发技术。
|
3月前
|
Java Nacos Maven
Eureka服务注册与发现
本节介绍Spring Cloud中Eureka注册中心的搭建与使用,完成服务注册与发现功能,并通过user-service和order-service实例演示多节点部署及动态调用,为后续Nacos替换Eureka奠定基础。
 Eureka服务注册与发现
|
3月前
|
存储 运维 Java
微服务概述
本文对比单体与微服务架构,解析微服务定义、优缺点及技术实现。微服务通过拆分业务、独立部署、轻量通信提升系统扩展性与维护性,虽带来运维与分布式事务挑战,但仍是现代应用架构演进方向。
 微服务概述

热门文章

最新文章