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个选择:
在控制器处理程序中显式声明这两个路由@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);
}
Run Code Online (Sandbox Code Playgroud)
rewritenginx 中的规则)以匹配预期的 url。HTTP 301在选项 2 和 3 中,您也可以选择返回响应。
| 归档时间: |
|
| 查看次数: |
10710 次 |
| 最近记录: |