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 3e275bb3601..ef805b2bf1c 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 @@ -279,7 +279,7 @@ public final class UrlHandlerFilter extends OncePerRequestFilter { @Override public boolean canHandle(HttpServletRequest request, RequestPath path) { List elements = path.elements(); - return (!elements.isEmpty() && elements.get(elements.size() - 1).value().equals("/")); + return (elements.size() > 1 && elements.get(elements.size() - 1).value().equals("/")); } @Override 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 b7585744fe4..f8dec6ba1f3 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 @@ -69,6 +69,23 @@ public class UrlHandlerFilterTests { assertThat(actual.getPathInfo()).isEqualTo(pathInfo); } + @Test + void shouldNotSkipTrailingSlashForRootPath() throws Exception { + UrlHandlerFilter filter = UrlHandlerFilter.trailingSlashHandler("/**").wrapRequest().build(); + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/"); + request.setPathInfo("/"); + + MockFilterChain chain = new MockFilterChain(); + filter.doFilterInternal(request, new MockHttpServletResponse(), chain); + + HttpServletRequest actual = (HttpServletRequest) chain.getRequest(); + assertThat(actual).isNotNull().isSameAs(request); + assertThat(actual.getRequestURI()).isEqualTo("/"); + assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/"); + assertThat(actual.getServletPath()).isEqualTo(""); + assertThat(actual.getPathInfo()).isEqualTo("/"); + } + @Test void noTrailingSlashWithRequestWrapping() throws Exception { testNoTrailingSlashWithRequestWrapping("/path/**", "/path/123");