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();

}

}


相关文章
|
数据采集 监控 API
链路追踪(Tracing)其实很简单——分布式链路追踪的诞生
作者:夏明(涯海) 创作日期:2022-07-14 专栏地址:【稳定大于一切】【稳定大于一切】为了应对分布式环境下的不一致、模糊性等问题,人们试图通过请求粒度的轨迹追踪与数据透传,实现节点间的确定性关联,分布式链路追踪技术也由此诞生。里程碑事件:Google Dapper分布式链路追踪诞生的标志性事...
1009 0
链路追踪(Tracing)其实很简单——分布式链路追踪的诞生
|
6月前
|
人工智能 自然语言处理 安全
性价比高的智能客服系统推荐(2025年12月更新)
在数字化时代,智能客服已成为提升客户体验的核心。本文对比瓴羊Quick Service、合力亿捷云客服、Intercom、Freshdesk、Zendesk五大主流产品,从功能、AI能力、部署模式、行业适配等维度深入分析,结合企业规模与业务需求,提供科学选型建议,助力企业实现服务智能化升级,降本增效。
|
API Android开发
华为底部虚拟导航栏挡住布局
问题:在实现ViewPager+Fragment+侧滑栏的界面时,华为搭载Android5.0以上操作系统的手机出现底部虚拟导航栏挡住布局。
3558 0
|
3月前
|
安全 NoSQL Java
基于JWT+SpringSecurity整合一个单点认证授权机制
本文介绍了基于JWT和SpringSecurity的授权认证机制架构设计。系统采用RBAC权限模型,通过5张表描述用户-角色-权限关系。认证流程包含登录验证、IP检查、密码匹配等环节,使用JWT生成token并保存用户信息到Redis。授权部分利用@PreAuthorize注解和PermissionService实现权限校验,支持单权限、多权限及角色验证。整体架构通过过滤器链实现无状态认证,兼顾安全性和灵活性,为开发者提供了完整的认证授权解决方案。
|
Linux 网络安全 Ubuntu
Linux下修改ssh端口和禁止root远程登录
Linux下修改ssh端口和禁止root远程登录     我们都知道,ssh默认端口号是22,要更改端口号为9688,需要编辑/etc/ssh/ssh_config和/etc/ssh/sshd_config两个文件即可;     禁止root远程登录,则需要编辑/etc/ssh/sshd_config。
2815 0
|
并行计算 Ubuntu Linux
配置阿里云GPU服务器py-tf环境
本文分为如下几个部分 • 什么是GPU服务器 • 租用阿里云GPU服务器ubuntu系统 • 安装python3.6 • 安装pip • 安装anaconda3 • 配置jupyter • 服务器与本地windows文件互传 • 安装GPU版TensorFlow • 开启多个进程(多个窗口) • 本地sublime编辑远程文件 • vim配置
1091 1
配置阿里云GPU服务器py-tf环境
|
人工智能 语音技术
通义语音AI技术问题之语义VAD模型对于传统VAD模型的问题如何解决
通义语音AI技术问题之语义VAD模型对于传统VAD模型的问题如何解决
2264 0
[Qt5&控件] 选项卡tabWidget控件隐藏&增加tab个数
[Qt5&控件] 选项卡tabWidget控件隐藏&增加tab个数
1340 0
|
传感器 存储 缓存
STM32--MPU6050与I2C外设
STM32--MPU6050与I2C外设
769 1
|
自然语言处理 搜索推荐 算法
深入浅出:用Python打造个性化新闻聚合器
【8月更文挑战第29天】在信息爆炸的时代,快速获取和筛选感兴趣的新闻内容成为一项挑战。本文将引导你使用Python构建一个简单的个性化新闻聚合器,从而高效地从海量信息中提取价值。通过学习本文,你将能够实现一个基本的爬虫,利用推荐算法为用户定制新闻流,并了解如何部署和维护这样一个系统。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将成为你技术成长路径上的一块垫脚石。

热门文章

最新文章