diff --git a/application/src/main/java/run/halo/app/infra/config/WebFluxConfig.java b/application/src/main/java/run/halo/app/infra/config/WebFluxConfig.java index d57d84f7c..72c94ab94 100644 --- a/application/src/main/java/run/halo/app/infra/config/WebFluxConfig.java +++ b/application/src/main/java/run/halo/app/infra/config/WebFluxConfig.java @@ -25,6 +25,7 @@ import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.lang.NonNull; import org.springframework.web.filter.reactive.ServerWebExchangeContextFilter; +import org.springframework.web.filter.reactive.UrlHandlerFilter; import org.springframework.web.reactive.config.ResourceHandlerRegistration; import org.springframework.web.reactive.config.ResourceHandlerRegistry; import org.springframework.web.reactive.config.WebFluxConfigurer; @@ -267,4 +268,11 @@ public class WebFluxConfig implements WebFluxConfigurer { return new ServerWebExchangeContextFilter(); } + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + UrlHandlerFilter urlHandlerFilter() { + return UrlHandlerFilter + .trailingSlashHandler("/**").mutateRequest() + .build(); + } } diff --git a/application/src/test/java/run/halo/app/config/WebFluxConfigTest.java b/application/src/test/java/run/halo/app/config/WebFluxConfigTest.java index dc94b3490..ce5a33f1d 100644 --- a/application/src/test/java/run/halo/app/config/WebFluxConfigTest.java +++ b/application/src/test/java/run/halo/app/config/WebFluxConfigTest.java @@ -42,7 +42,8 @@ import run.halo.app.extension.Metadata; SpringBootTest.WebEnvironment.RANDOM_PORT) @Import({ WebFluxConfigTest.WebSocketSupportTest.TestWebSocketConfiguration.class, - WebFluxConfigTest.ServerWebExchangeContextFilterTest.TestConfig.class + WebFluxConfigTest.ServerWebExchangeContextFilterTest.TestConfig.class, + WebFluxConfigTest.UrlHandlerFilterTest.TestConfig.class }) @AutoConfigureWebTestClient class WebFluxConfigTest { @@ -206,4 +207,29 @@ class WebFluxConfigTest { } } + + @Nested + class UrlHandlerFilterTest { + + @TestConfiguration + static class TestConfig { + + @Bean + RouterFunction urlHandlerFilterTestRoute() { + return RouterFunctions.route() + .GET("/fake", request -> ServerResponse.ok().bodyValue("ok")) + .build(); + } + + } + + @Test + void shouldHandleUrlWithTrailingSlash() { + webClient.get().uri("/fake/") + .exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo("ok"); + } + + } } \ No newline at end of file