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

简介: 基于Spring AOP实现切面整合,通过@Pointcut、@Before、@Around和@After注解对Controller层方法进行参数拦截与日志记录。可获取请求来源、URL、方式、参数及执行耗时,便于调试与监控,支持后续扩展至数据库存储或ELK日志分析,提升系统可观测性。

整合切面,参数拦截+过滤
Java
运行代码
复制代码

package cn.zhicall.web.aspect;
//为了记录执行时间 方便调试 如果不需要可以去掉
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();
}

}

相关文章
|
2月前
|
存储 JSON NoSQL
MongoDB常用命令
本文介绍MongoDB常用命令,涵盖数据库创建与删除(use、show dbs、dropDatabase)、集合操作(createCollection、drop)及文档的增删改查(insert、find、update、remove)。详解分页查询中limit、skip、sort用法及注意事项,适用于文章评论等数据管理场景。
|
2月前
|
安全 数据安全/隐私保护 微服务
什么是权限管理
权限管理是系统安全的核心,包含认证与授权两大机制。认证确认用户身份(如登录),授权则根据角色分配访问权限,避免越权操作。通过角色叠加形成菜单权限集合,保障数据安全与流程顺畅。常见模型有ACL、RBAC等,支撑系统的CURD操作与微服务架构安全。
|
2月前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出SQL质量监控功能,集成于CloudLens for SLS,助力用户从健康分、服务指标、运行明细、SQL Pattern及优化建议五大维度,全面掌握SQL使用情况,提升查询效率与资源治理能力。
|
2月前
|
缓存 JavaScript 前端开发
腾讯面经
本文整理了腾讯前端面试中的高频考点,涵盖JavaScript基础(数据类型、闭包、原型链、event-loop)、DOM/BOM操作、网络协议(HTTP/HTTPS、TCP握手、缓存机制)、框架原理(React/Vue、Redux、响应式)、算法实现(快排、大数相加、树遍历)、安全防护(XSS、CSRF)、工程化(Webpack、PWA)及综合问题,全面覆盖前端核心技术体系,适合求职者系统复习与提升。
|
2月前
|
域名解析 缓存 网络协议
CDN加速
CDN(内容分发网络)通过全球部署节点,将源站内容缓存至边缘服务器,用户访问时通过智能调度就近获取资源。利用DNS解析与CNAME重定向,结合缓存机制,提升访问速度,降低源站负载,有效解决网络拥堵、延迟高等问题,提升网站响应速度与可用性。(238字)
|
2月前
|
缓存
浏览器缓存
浏览器缓存通过Cache-Control和ETag实现。Cache-Control控制缓存策略,如public、private、max-age等;ETag则用于资源变更验证,配合If-None-Match实现304协商缓存。结合内容哈希可优化静态资源更新,提升性能。
|
2月前
|
JSON Java 数据格式
不定参数入参
支持多种入参方式:非JSON格式(如基本类型、@RequestParam、@RequestBody)和JSON格式(单个/多个参数封装为JSONObject或实体类)。通过@Valid注解实现参数校验,确保数据有效性,提升接口健壮性。
|
2月前
|
SQL 缓存 Java
汇总
本文汇总MyBatis核心配置与使用要点,涵盖配置加载优先级、多环境配置、事务管理、XML映射(一对一、一对多等)、分页策略(逻辑与物理分页)、缓存机制、执行器类型及批量操作源码分析,助力高效开发。
|
2月前
|
XML Java Maven
打包
使用Maven将Spring Boot项目打包成可执行JAR,配置mainClass并执行`mvn clean package`生成单个jar文件,通过`java -jar`运行,支持前台或后台启动,结束进程时通过端口查PID后`kill -9`终止。也可分离依赖与配置进行灵活部署。
|
2月前
|
Web App开发 JavaScript 安全
跨域处理
跨域指不同域名、协议或端口间请求受阻。通过CORS(跨域资源共享)可在HTTP头中设置Access-Control-Allow-Origin,实现安全跨域。Spring Boot可通过@CrossOrigin注解、WebMvcConfigurer全局配置或自定义Filter等方式解决跨域问题,支持细粒度控制允许的域名与请求方式,确保应用安全与灵活通信。