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

简介: 该Java类 `RequestParamsAspect` 基于Spring AOP实现,用于拦截Web层请求。通过切面在方法执行前记录请求来源、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月前
|
安全 NoSQL Java
基于JWT+SpringSecurity整合一个单点认证授权机制
本文介绍了基于JWT和SpringSecurity的授权认证机制架构设计。系统采用RBAC权限模型,通过5张表描述用户-角色-权限关系。认证流程包含登录验证、IP检查、密码匹配等环节,使用JWT生成token并保存用户信息到Redis。授权部分利用@PreAuthorize注解和PermissionService实现权限校验,支持单权限、多权限及角色验证。整体架构通过过滤器链实现无状态认证,兼顾安全性和灵活性,为开发者提供了完整的认证授权解决方案。
计算机网络的功能
计算机网络的功能。
632 0
|
分布式计算 资源调度 大数据
黑马程序员-大数据入门到实战-MapReduce & YARN入门
黑马程序员-大数据入门到实战-MapReduce & YARN入门
417 0
|
3月前
|
存储 新零售 人工智能
【云故事探索】 NO.21 | 良品铺子:70TB 核心数据“闪电”上云,重塑零食帝国的数字底座
本期,我们走进零售行业领军者——良品铺子,聆听他们如何将运行十年的核心系统搬上云端,打造更智能的“零食帝国”。
|
6月前
|
人工智能 自然语言处理 安全
性价比高的智能客服系统推荐(2025年12月更新)
在数字化时代,智能客服已成为提升客户体验的核心。本文对比瓴羊Quick Service、合力亿捷云客服、Intercom、Freshdesk、Zendesk五大主流产品,从功能、AI能力、部署模式、行业适配等维度深入分析,结合企业规模与业务需求,提供科学选型建议,助力企业实现服务智能化升级,降本增效。
|
6月前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图。横轴为对象,纵轴为时间,通过消息展现动态协作。强调时间顺序,可用于建模系统交互、展示并发进程。主要元素包括角色、对象、生命线、控制焦点和各类消息,如同步、异步与返回消息,支持自关联调用,直观呈现系统行为流程。
系统时序图
|
6月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文详细介绍Nacos作为配置中心的实现原理与实践,涵盖配置管理、热更新、共享配置及优先级规则,并演示集群搭建与高可用部署,助力微服务架构下配置的集中化、动态化管理。
 Nacos配置中心
|
自然语言处理 搜索推荐 算法
深入浅出:用Python打造个性化新闻聚合器
【8月更文挑战第29天】在信息爆炸的时代,快速获取和筛选感兴趣的新闻内容成为一项挑战。本文将引导你使用Python构建一个简单的个性化新闻聚合器,从而高效地从海量信息中提取价值。通过学习本文,你将能够实现一个基本的爬虫,利用推荐算法为用户定制新闻流,并了解如何部署和维护这样一个系统。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将成为你技术成长路径上的一块垫脚石。
|
人工智能 语音技术
通义语音AI技术问题之语义VAD模型对于传统VAD模型的问题如何解决
通义语音AI技术问题之语义VAD模型对于传统VAD模型的问题如何解决
2216 0
|
传感器 存储 缓存
STM32--MPU6050与I2C外设
STM32--MPU6050与I2C外设
747 1

热门文章

最新文章