5-9 SpringBoot AOP的使用

Posted 孤注一掷 、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5-9 SpringBoot AOP的使用相关的知识,希望对你有一定的参考价值。

配置AOP,打印接口耗时、请求参数、返回参数。
新建:

 

@Aspect
@Component
public class LogAspect 

    private final static Logger LOG = LoggerFactory.getLogger(LogAspect.class);

    /**
     * 定义一个切点
     */
    @Pointcut("execution(public * com.swk.*.controller..*Controller.*(..))")
    public void controllerPointcut() 
    

    @Before("controllerPointcut()")
    public void doBefore(JoinPoint joinPoint) throws Throwable 

        // 开始打印请求日志
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Signature signature = joinPoint.getSignature();
        String name = signature.getName();

        // 打印请求信息
        LOG.info("------------- 开始 -------------");
        LOG.info("请求地址:  ", request.getRequestURL().toString(), request.getMethod());
        LOG.info("类名方法: .", signature.getDeclaringTypeName(), name);
        LOG.info("远程地址: ", request.getRemoteAddr());

        // 打印请求参数
        Object[] args = joinPoint.getArgs();
        // LOG.info("请求参数: ", JSONObject.toJSONString(args));

        Object[] arguments = new Object[args.length];
        for (int i = 0; i < args.length; i++) 
            if (args[i] instanceof ServletRequest
                    || args[i] instanceof ServletResponse
                    || args[i] instanceof MultipartFile) 
                continue;
            
            arguments[i] = args[i];
        
        // 排除字段,敏感字段或太长的字段不显示
        String[] excludeProperties = "password", "file";
        PropertyPreFilters filters = new PropertyPreFilters();
        PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
        excludefilter.addExcludes(excludeProperties);
        LOG.info("请求参数: ", JSONObject.toJSONString(arguments, excludefilter));
    

    @Around("controllerPointcut()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable 
        long startTime = System.currentTimeMillis();
        Object result = proceedingJoinPoint.proceed();
        // 排除字段,敏感字段或太长的字段不显示
        String[] excludeProperties = "password", "file";
        PropertyPreFilters filters = new PropertyPreFilters();
        PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
        excludefilter.addExcludes(excludeProperties);
        LOG.info("返回结果: ", JSONObject.toJSONString(result, excludefilter));
        LOG.info("------------- 结束 耗时: ms -------------", System.currentTimeMillis() - startTime);
        return result;
    

定义一个切点,*表示不管是什么,都生效,监控所有的controller及其中的所有方法、所有参数。

@Before:前置通知,即执行业务代码之前,我们要去做的事情。

AOP和过滤器拦截器有一点不同,它拿到的参数是通过JoinPoint这个连接点,通过循环结构就可以得到多个参数。有些项目有很多的敏感字段,如身份证号、手机号等等。这些是不能打印的,需要把这些排除掉。包括太长的文本也不需要显示。

如下:

@Around:环绕通知。即围绕业务内容,前面执行一点东西,后面再执行一点东西。

通知三个重要:前置、后置和环绕

整个类叫做切面,即切点和通知结合。

过滤器、拦截器和AOP三选一即可。

 这里我们选择AOP,将以下的过滤器和拦截器内容注释掉即可:

 

以上是关于5-9 SpringBoot AOP的使用的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 基础系列接口上注解 AOP 拦截不到场景兼容实例演示

SpringBoot自定义注解+AOP+redis实现防接口幂等性重复提交,从概念到实战

(14)SpringBoot使用AOP

springboot中使用AOP做访问请求日志

springboot 集成aop模块

SpringBoot整合AOP