webflux过滤器被调用两次?

5lhxktic  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(370)

经过长时间的彻底搜索,请求帮助。我在写一封信 JwtTokenFilter 在 Spring webflux与 Spring 安全相结合。问题是这个过滤器在一个请求中被调用了两次。过滤器代码如下。

@Component
class JwtTokenAuthenticationFilter(
    @Autowired val tokenProvider: JwtTokenProvider
) : WebFilter {
    private val HEADER_PREFIX = "Bearer "

    override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void?> {
        val token = resolveToken(exchange.request)
        return if (StringUtils.hasText(token) && tokenProvider.validateToken(token)) {
            val authentication: Authentication = tokenProvider.getAuthentication(token)
            chain.filter(exchange)
                .contextWrite(ReactiveSecurityContextHolder.withAuthentication(authentication))
        } else
            chain.filter(exchange)
    }

    private fun resolveToken(request: ServerHttpRequest): String? {
        val bearerToken = request.headers.getFirst(HttpHeaders.AUTHORIZATION)
        return if (StringUtils.hasText(bearerToken) && bearerToken!!.startsWith(HEADER_PREFIX)) {
            bearerToken.substring(7)
        } else null
    }
}

这个问题可以通过删除过滤器上的@component注解来避免,但这意味着我必须在路径中创建这个对象及其所有依赖项,这完全剥夺了spring的依赖项反转的优势。因此,我想保留使用spring注解来完成工作。但是,这会产生一个问题,即过滤器在两个地方注册,即servlet容器和Spring Security 。
本文提出的解决方案讨论了这个问题。
但是找不到将该文章中的解决方案应用于webfilter的方法,因为该文章中的解决方案是针对servlet过滤器的。
那么,有没有一种方法可以避免servlet容器调用这个bean,而只允许spring security调用它呢。或者你看到的代码中有什么问题?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题