背景
在做易支付(个人免签支付平台)的时候,使用了过滤器来做了接口日志打印、跨域处理、登录验证等功能,最近查看日志文件的时候突然发现日志打印的信息都是成双成对的,当时意识到不妙,是不是接口重复请求了?
但经过仔细的复现发现,接口并没有重复请求,仅仅是过滤器的被重复执行了,导致日志打印重复。
问题排查
既然不是接口的问题,那么过滤器为什么会执行两次呢?
问题代码如下:
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
注解