首页 > 解决方案 > 如何使 WebFilter 在非 WebFlux/非反应式 Spring Boot 应用程序中工作?

问题描述

我正在尝试解决这个问题:How to rewrite URLs with Spring (Boot) via REST Controllers? 通过创建某种“过滤器”,该过滤器将应用于每个传入的 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);
    }

}

...以同样的方式人们正在做类似的事情:

唉,我的过滤器从来没有被调用过!!!

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

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

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

标签: spring-bootspring-mvcfilterspring-webflux

解决方案


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

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


推荐阅读