diff --git a/spring-web/src/main/java/org/springframework/web/filter/UrlHandlerFilter.java b/spring-web/src/main/java/org/springframework/web/filter/UrlHandlerFilter.java index 4112fee6099..c64a12d116a 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/UrlHandlerFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/UrlHandlerFilter.java @@ -299,9 +299,14 @@ public final class UrlHandlerFilter extends OncePerRequestFilter { public void handleInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException { + String location = trimTrailingSlash(request.getRequestURI()); + if (StringUtils.hasText(request.getQueryString())) { + location += "?" + request.getQueryString(); + } + response.resetBuffer(); response.setStatus(this.httpStatus.value()); - response.setHeader(HttpHeaders.LOCATION, trimTrailingSlash(request.getRequestURI())); + response.setHeader(HttpHeaders.LOCATION, location); response.flushBuffer(); } } diff --git a/spring-web/src/main/java/org/springframework/web/filter/reactive/UrlHandlerFilter.java b/spring-web/src/main/java/org/springframework/web/filter/reactive/UrlHandlerFilter.java index 528f8c7883c..33d612380df 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/reactive/UrlHandlerFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/reactive/UrlHandlerFilter.java @@ -290,9 +290,16 @@ public final class UrlHandlerFilter implements WebFilter { @Override public Mono handleInternal(ServerWebExchange exchange, WebFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + String query = request.getURI().getRawQuery(); + String location = trimTrailingSlash(request); + if (StringUtils.hasText(query)) { + location += "?" + query; + } + ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(this.statusCode); - response.getHeaders().set(HttpHeaders.LOCATION, trimTrailingSlash(exchange.getRequest())); + response.getHeaders().set(HttpHeaders.LOCATION, location); return Mono.empty(); } } diff --git a/spring-web/src/test/java/org/springframework/web/filter/UrlHandlerFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/UrlHandlerFilterTests.java index df01c8f09bd..e020527fb1f 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/UrlHandlerFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/UrlHandlerFilterTests.java @@ -78,14 +78,18 @@ public class UrlHandlerFilterTests { UrlHandlerFilter filter = UrlHandlerFilter.trailingSlashHandler("/path/*").redirect(status).build(); String path = "/path/123"; + MockHttpServletRequest request = new MockHttpServletRequest("GET", path + "/"); MockHttpServletResponse response = new MockHttpServletResponse(); - MockFilterChain chain = new MockFilterChain(); - filter.doFilterInternal(new MockHttpServletRequest("GET", path + "/"), response, chain); + + String queryString = "foo=bar"; + request.setQueryString(queryString); + + filter.doFilterInternal(request, response, chain); assertThat(chain.getRequest()).isNull(); assertThat(response.getStatus()).isEqualTo(status.value()); - assertThat(response.getHeader(HttpHeaders.LOCATION)).isEqualTo(path); + assertThat(response.getHeader(HttpHeaders.LOCATION)).isEqualTo(path + "?" + queryString); assertThat(response.isCommitted()).isTrue(); } diff --git a/spring-web/src/test/java/org/springframework/web/filter/reactive/UrlHandlerFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/reactive/UrlHandlerFilterTests.java index 8ec47811196..14a8e40440b 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/reactive/UrlHandlerFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/reactive/UrlHandlerFilterTests.java @@ -64,14 +64,15 @@ public class UrlHandlerFilterTests { UrlHandlerFilter filter = UrlHandlerFilter.trailingSlashHandler("/path/*").redirect(status).build(); String path = "/path/123"; - MockServerHttpRequest original = MockServerHttpRequest.get(path + "/").build(); + String queryString = "foo=bar"; + MockServerHttpRequest original = MockServerHttpRequest.get(path + "/?" + queryString).build(); ServerWebExchange exchange = MockServerWebExchange.from(original); assertThatThrownBy(() -> invokeFilter(filter, exchange)) .hasMessageContaining("No argument value was captured"); assertThat(exchange.getResponse().getStatusCode()).isEqualTo(status); - assertThat(exchange.getResponse().getHeaders().getLocation()).isEqualTo(URI.create(path)); + assertThat(exchange.getResponse().getHeaders().getLocation()).isEqualTo(URI.create(path + "?" + queryString)); } @Test