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

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

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 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 数据安全/隐私保护
使用Selenium进行网页登录和会话管理
使用Selenium进行网页登录和会话管理
|
存储 Linux 数据安全/隐私保护
如何在本地Docker中部署MinIO服务并实现远程访问管理界面
如何在本地Docker中部署MinIO服务并实现远程访问管理界面
1229 0
|
机器学习/深度学习 人工智能 安全
智能之网:探索人工智能在现代通信系统中的应用与挑战
【8月更文挑战第4天】 随着人工智能技术的快速发展,其在通信领域的应用也日益广泛。从信号处理到网络优化,人工智能正在重塑通信行业的未来。本文将深入探讨人工智能如何革新现代通信系统,包括提高数据传输效率、增强网络安全、优化资源分配等方面,并分析面临的主要挑战及未来的发展方向。
714 3
|
Prometheus 负载均衡 算法
如何让gRPC具备微服务治理能力
如何让gRPC具备微服务治理能力
|
Java 应用服务中间件 调度
Tomcat 线程池
Tomcat 线程池
|
算法 调度 Python
基于蚂蚁优化算法的柔性车间调度研究(Python代码实现)
基于蚂蚁优化算法的柔性车间调度研究(Python代码实现)
264 0
|
人工智能 自然语言处理 搜索推荐
AI智能导诊源码,可应用于微信线上挂号、互联网医院、区域平台、智能硬件等场景
人体智能导诊系统:是基于医疗AI、自然语言处理技术,推出的在线导医分诊智能工具,在医疗中使用的引导患者自助就诊挂号。 在就诊的过程中有许多患者不知道需要挂什么号,要看什么病,通过人体智能导诊系统,点击对应的人体部位,选择自身疾病的症状表现,准确推荐科室,引导患者挂号就诊,实现科学就诊,减少患者挂错号多跑路的情况。可应用于微信线上挂号、互联网医院、区域平台等场景中,解决了患者因医学知识缺乏,院内咨询不便所导致的医患资源错配的痛点,同时满足医院智慧服务评级的诉求。
437 0
|
设计模式 算法 Java
Java迭代器模式:优雅遍历集合,实现简洁高效的迭代器设计(上)
Java迭代器模式:优雅遍历集合,实现简洁高效的迭代器设计
9568 1
Java迭代器模式:优雅遍历集合,实现简洁高效的迭代器设计(上)
|
算法 索引 Python
使用遗传算法解决图着色问题
图着色任务可以简单概括为:为图中的每个节点分配一种颜色,并保证相连接的节点对不会使用相同的颜色,同时,我们希望使用尽可能少的颜色。本文使用遗传算法解决图着色问题。
2026 0
使用遗传算法解决图着色问题
vue-element-admin打包后白屏的问题
vue-element-admin打包后白屏的问题
199 0