我们可以在 Spring Webflux 中使用 web servlet 和 servlet 过滤器吗?

Posted

技术标签:

【中文标题】我们可以在 Spring Webflux 中使用 web servlet 和 servlet 过滤器吗?【英文标题】:Can we use web servlets and servlet filters in Spring Webflux? 【发布时间】:2018-07-17 20:40:59 【问题描述】:

我想从 Spring MVC 迁移到 Spring Webflux,但是我使用了一些来自 3rd 方的 servlet 过滤器和 web servlet,必须迁移到它们的等效 Webflux 版本。

但这不切实际,因为它们来自 3rd 方框架。 例如:H2服务器WebServletMetricsServletInstrumentedFilter

有什么方法可以将 servlet 或 servlet 过滤器转换为其等效的 Webflux 版本?

【问题讨论】:

不,没有... servlet 的东西是基于标准化的 API 的,反应式实现没有这样的东西。更不用说整个技术堆栈是不同的。尽管您可能能够固定一些东西,但它基本上会使您的反应部分无用,因为固定的东西需要阻塞(由于 servlet 堆栈的 API 设计)。 【参考方案1】:

您可以使用 tomcat 作为 webflux 实现(可以通过排除 netty starter 并包括 tomcat starter 来实现)。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <version>$spring-boot.version</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>$spring-boot.version</version>

        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-reactor-netty</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

您可以通过创建WebServerFactoryCustomizer&lt;TomcatReactiveWebServerFactory&gt; bean 并通过Context 接口添加过滤器来添加servlet 过滤器。例如:

@Bean
public WebServerFactoryCustomizer<TomcatReactiveWebServerFactory> customizer() 
    return factory -> factory.addContextCustomizers(
            context -> 

                FilterDef filterDef = new FilterDef();
                filterDef.setFilterName("name");
                filterDef.setFilter(new SomeFilter());

                FilterMap filterMap = new FilterMap();
                filterMap.setFilterName("name");
                filterMap.addURLPattern("/url/pattern");

                context.addFilterMap(filterMap);
                context.addFilterDef(filterDef);
            
    );

tomcat Servlet 配置为 webflux“实现”时的默认名称是 httpHandlerServlet

【讨论】:

以上是关于我们可以在 Spring Webflux 中使用 web servlet 和 servlet 过滤器吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring-webflux中获取当前请求的上下文

Spring WebFlux 请求主体在测试中为空

Spring WebFlux + Security - 我们有“记住我”功能吗?

Spring Webflux SecurityValidate OAuth2 JWT 令牌

使用 Spring Webflux 返回元素列表

如何使用 Webflux 在 Spring API 处理程序方法中访问 JWT 声明?