如何在Spring Boot 3中忽略webflux中的拖尾斜线?

xa9qqrwz  于 2022-12-23  发布在  Spring
关注(0)|答案(1)|浏览(284)

在Sping Boot 3中,它们已经改变,默认情况下,尾部的斜线不再被忽略。例如,如果我有一个GET资源/users,并且我导航到/users/,那么Spring Boot webflux现在将以404响应。
您可以通过实现WebFluxConfigurer并重写configurePathMatching方法来更改此设置:

@Override
public void configurePathMatching(PathMatchConfigurer configurer) {
     configurer.setUseTrailingSlashMatch();
}

但是,setUseTrailingSlashMatch已经过时了,文档上说应该使用PathPatternParser.setMatchOptionalTrailingSeparator(boolean),但是,我不明白您实际上是如何/在哪里配置的。
所以问题是,如何设置PathPatternParser.setMatchOptionalTrailingSeparator(boolean)

mwg9r5ms

mwg9r5ms1#

正如@joe-clay在他的评论中提到的,PathPatternParser.setMatchOptionalTrailingSeparator(boolean)也被明确的重定向所取代,所以你有3种选择:
1.在控制器处理程序@GetMapping("/users", "/users/")中显式声明两条路由,缺点是需要对每个控制器都这样做,但可以用作权宜之计。
1.实现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);
}

1.在代理中显式重写传入的url(例如在nginx中使用rewrite规则)以匹配预期的url。
在选项2和3中,您也可以选择返回HTTP 301响应。

相关问题