我们可以在 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服务器WebServlet
和MetricsServlet
和InstrumentedFilter
。
有什么方法可以将 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<TomcatReactiveWebServerFactory>
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 + Security - 我们有“记住我”功能吗?