当前位置: 首页 > 知识库问答 >
问题:

如何使WebFilter在一个非webflux/非反应性的Spring引导应用程序中工作?

鲍向笛
2023-03-14

我正在尝试解决这个问题:如何通过REST控制器用Spring(引导)重写URL?通过创建某种类型的“过滤器”来应用于每个传入的HTTP请求。

这个问题包含了一些答案,比如这个问题:Spring Boot添加了Http请求拦截器,但接口HandlerInterceptor处理的是Javax'HttpServletRequestHttpServletResponse,它们不如Spring引入的新类实用,即ServerWebExchange(请参阅下面代码中setLocation())出现在一个名称听起来很有前途的接口org.springframework.web.server.webfilter:

所以我的结尾是这样的:

@Component
public class LegacyRestRedirectWebFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        URI origin = exchange.getRequest().getURI();
        String path = origin.getPath();
        if (path.startsWith("/api/")) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
            URI location = UriComponentsBuilder.fromUri(origin).replacePath(path.replaceFirst("/api/", "/rest/")).build().toUri();
            response.getHeaders().setLocation(location);
        }
        return chain.filter(exchange);
    }

}

...就像人们在做类似的事情一样:

  • Spring WebFlux添加WebFIlter以匹配特定路径
  • WebFlux应用程序中的WebFilter

问题是:我不是在“webflux”上下文中(与上面的问题相反),因为:

  1. 我不需要,并且
  2. 我尝试了一下,得到了以下问题:

>

  • 当类路径中有spring-boot-starter-web依赖项(但没有确定答案)时,反应式Webfilter无法工作;标记的副本:don't spring-boot-starter-web和spring-boot-starter-webflux一起工作吗?

    具有传统Web安全性的Spring WebFlux(我的pom.xml中有“传统”spring-boot-starter-security依赖项,加上一个扩展WebSecurityConfigurerAdapter@configuration类-但不愿意将其迁移到...顺便说一下?)

    我也不明白为什么我需要在WebFlux上下文中,因为org.springframework.web.server.webfilter既不处理reactive也不处理WebFlux?..还是真的?这在Javadoc中不是很清楚。

  • 共有1个答案

    芮学
    2023-03-14

    事实上,我没有在非WebFlux上下文中工作webfilter,但我可以成功实现这样的过滤器,它既实现了javax.servlet.filter(非反应性),又实现了org.springframework.web.server.webfilter(反应性)。

    下面是我对另一个相关问题的回答:https://stackoverflow.com/A/63780659/666414

     类似资料:
    • 我遇到的问题是filter方法永远不会执行,并且上下文也没有设置。我已经确认Webfilter是在启动时加载的。还有什么需要让过滤器工作吗?

    • 我想实现一个WebFilter,它读取传入请求的特定头,用这个头的值调用一个GET请求到另一个反应RESTendpoint,然后用GET响应的值修改原始请求。 我想在WebFilter中实现这一点,因为我不想将此函数调用添加到我的中的每个函数中。 目前我有这个: 这显然现在不起作用。我的网络客户端正在返回单声道,所以我不能在我的调用中直接使用它,因为这需要一个字符串。出于显而易见的原因,我也不能真

    • 我确实看到字符串按规则间隔打印(println(it))。 我正在使用以下卷曲:

    • 我正在评估使用Spring Webflux,但我们必须支持期望Application/JSON,而不是Application/Stream+JSON的客户机。我不清楚Spring WebFlux如何在需要Application/JSON的客户机的情况下处理Flux的序列化。 如果一个Flux序列化为application/json,而不是application/stream+json,这是一个阻塞

    • 通过调用直接创建通量并在的lambada表达式中使用接收器,与使用提供的接收器有什么区别? 在一个Flux只发出几个事件的最小示例中,我可以 与使用 为了澄清一下:我知道我可以在这里使用,但我的用例实际上是在Spring的和Spring WebFlux之间建立一个桥梁,在这里我想为每个传入的特定资源SSE请求创建一个Flux,然后将事件发布到这个Flux。 另一方面,它有不能处理背压的局限性。因此

    • 问题内容: 我正在评估使用Spring Webflux,但我们必须支持期望使用application / json而不是application / stream + json的客户端。我不清楚在需要application / json的客户端中,Spring WebFlux如何处理序列化Flux。 如果将Flux序列化为application / json而不是application / stre