如何使WebFilter在非WebFlux/非反应式Spring Boot应用程序中工作



我正试图解决这个问题:如何通过REST控制器用Spring(Boot(重写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. 我尝试了一下,但遇到了以下问题:
  • Reactive Webfilter在类路径中存在spring-boot-starter web依赖项时不起作用(但没有明确的答案(;标记的副本:Don';弹簧靴启动器web和弹簧靴启动器webflux是否协同工作?

  • 具有传统Web安全性的Spring WebFlux(我的pom.xml中有"传统"spring-boot-starter-security依赖项,还有一个扩展WebSecurityConfigurerAdapter@Configuration类,但不愿意将其迁移到……顺便说一句,是什么?(

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

事实上,我没有找到让WebFilter在非WebFlux上下文中工作的方法,但我可以成功地实现这样一个过滤器,它既实现了javax.servlet.Filter(非反应性(又实现了org.springframework.web.server.WebFilter(反应性(。

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

相关内容

最新更新