Spring WebFilter 重复调用

一个项目中使用了Spring Gateway网关,整合Security做安全认证,定义了一个JwtAuthenticationTokenWebFilter, 实现WebFilter,实现方式如下:

@Data
@Component
public class JwtAuthenticationTokenWebFilter implements WebFilter {...}
@Autowire
JwtAuthenticationTokenWebFilter jwtFilter;
...
seurity.securityContextRepository(NoOpServerSecurityContextRepository.getInstance())
                .addFilterBefore(jwtFilter, SecurityWebFiltersOrder.FORM_LOGIN)

测试过程中,调用地址在routePredicateMapping之前,进行了一次filter,之后又进行了一次filter,日志类似这样:

Spring WebFilter 重复调用

跟了几次调用堆栈,发现两次执行到WebFilterChain的时候,fiilterChain不是同一对象,chain的filterList也不同,但是都注入了JWT filter。第一次的WebFilterList显然是标准的web security过滤,但是第二次的主要是几个运维层面的过滤器,所以不确定这种被注入是否合理,奈何没有理解透彻spring的设计。

Spring WebFilter 重复调用

Spring WebFilter 重复调用

有了这个发现后,就尝试做了些调整,将@Component注解去掉:

@Data
public class JwtAuthenticationTokenWebFilter implements WebFilter {...}

security中注入的时候,手动创建filter:

JwtAuthenticationTokenWebFilter jwtFilter = new JwtAuthenticationTokenWebFilter();
seurity.securityContextRepository(NoOpServerSecurityContextRepository.getInstance())
                .addFilterBefore(jwtFilter, SecurityWebFiltersOrder.FORM_LOGIN)

再次调用,发现WebFilterChain的filterList,仅在security web 过滤时调用,mertrics的时候不再包含jwt filter, 问题得以解决。
Spring WebFilter 重复调用

猜你喜欢

转载自blog.51cto.com/10705830/2573631