如何在 Spring Boot 3 中忽略 webflux 中的尾部斜杠?

Joh*_*han 9 java spring-boot spring-webflux

在 Spring Boot 3 中,它们已发生更改,默认情况下不再忽略尾部斜杠。例如,如果我有一个 GET 资源,/users并且我导航到,/users/那么 Spring Boot webflux 现在将响应 404。

您可以通过实现WebFluxConfigurer并重写该configurePathMatching方法来更改此设置:

@Override
public void configurePathMatching(PathMatchConfigurer configurer) {
     configurer.setUseTrailingSlashMatch();
}
Run Code Online (Sandbox Code Playgroud)

然而,setUseTrailingSlashMatch它已被弃用,文档说可以使用PathPatternParser.setMatchOptionalTrailingSeparator(boolean)。但是,我不明白您实际如何/在哪里配置它。

那么问题来了,我该如何设置PathPatternParser.setMatchOptionalTrailingSeparator(boolean)呢?

小智 6

正如 @joe-clay 在他的评论中提到的,PathPatternParser.setMatchOptionalTrailingSeparator(boolean)它也被弃用,支持显式重定向。所以你有3个选择:

  1. 在控制器处理程序中显式声明这两个路由@GetMapping({"/users", "/users/"})。缺点是您需要为每个控制器执行此操作,但可以用作权宜之计。

  2. 实现org.springframework.web.server.WebFilter接口以显式重定向到所需的 url。沿着这些思路:

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {

    URI originalUri = exchange.getRequest().getURI();

    if (/* check condition for trailing slash using originalUri getPath(), getQuery() etc. */) {
        String originalPath = originalUri.getPath();
        String newPath = originalPath.substring(0, originalPath.length() - 1); // ignore trailing slash
        try {
            URI newUri = new URI(originalUri.getScheme(),
                    originalUri.getUserInfo(),
                    originalUri.getHost(),
                    originalUri.getPort(),
                    newPath,
                    originalUri.getQuery(),
                    originalUri.getFragment());

            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);    // optional
            response.getHeaders().setLocation(mutatedUri);

            return Mono.empty();

        } catch (URISyntaxException e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
    }
    return chain.filter(exchange);
}
Run Code Online (Sandbox Code Playgroud)
  1. 显式重写代理中的传入 url(例如使用rewritenginx 中的规则)以匹配预期的 url。

HTTP 301在选项 2 和 3 中,您也可以选择返回响应。

  • 您不知道删除此选项的理由吗?我可以理解它不再是默认的,但考虑到再次重新启用它似乎很困难,他们一定非常不喜欢它:) (2认同)