[英]How do you ignore trailing slash in webflux in spring boot 3?
在 Spring 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)
?
正如@joe-clay 在他的评论中提到的, PathPatternParser.setMatchOptionalTrailingSeparator(boolean)
也已弃用,支持显式重定向。 所以你有3个选择:
在控制器处理程序@GetMapping("/users", "/users/")
中显式声明这两个路由。 缺点是您需要为每个控制器执行此操作,但可以用作权宜之计。
实现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);
}
rewrite
规则)以匹配预期的 url。 在选项 2 和 3 中,您也可以选择返回HTTP 301
响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.