记一次SpringBoot Filter的坑-过滤器被重复执行问题

背景

在做易支付(个人免签支付平台)的时候,使用了过滤器来做了接口日志打印、跨域处理、登录验证等功能,最近查看日志文件的时候突然发现日志打印的信息都是成双成对的,当时意识到不妙,是不是接口重复请求了?

但经过仔细的复现发现,接口并没有重复请求,仅仅是过滤器的被重复执行了,导致日志打印重复。

问题排查

既然不是接口的问题,那么过滤器为什么会执行两次呢?

问题代码如下:

SpringBoot启动类

@ServletComponentScan("com.walter.filter")
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

过滤器

@Component
@WebFilter
@Order(1)
public class ControllerFilter implements Filter {
	// 业务逻辑
}

原来是因为我在启动类上加了 @ServletCompnentScan注解,过滤器就是在这个注解扫描的包下;而我又在过滤器上又同时加上了 @Component和 @WebFilter两个注解,导致这个过滤器在Spring容器启动的时候被加载了两次。

解决方案

方案1

删除过滤器的 @Component注解

方案2

删除启动类上 @ServletComponentScan注解

你可能感兴趣的:(spring,java,spring,boot)