diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlEncodingFilter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlEncodingFilter.java index 3ad462d5f250751135e1f433691a0d9c1b9eabc2..a9c864dc50aa789174a5023aff45ebe4cd397fb7 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlEncodingFilter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlEncodingFilter.java @@ -57,6 +57,9 @@ public class ResourceUrlEncodingFilter extends OncePerRequestFilter { private HttpServletRequest request; + /* Cache the index of the path within the DispatcherServlet mapping. */ + private Integer indexLookupPath; + private ResourceUrlEncodingResponseWrapper(HttpServletRequest request, HttpServletResponse wrapped) { super(wrapped); @@ -70,8 +73,11 @@ public class ResourceUrlEncodingFilter extends OncePerRequestFilter { logger.debug("Request attribute exposing ResourceUrlProvider not found."); return super.encodeURL(url); } - String resolvedUrl = resourceUrlProvider.getForRequestUrl(this.request, url); - return (resolvedUrl != null ? super.encodeURL(resolvedUrl) : super.encodeURL(url)); + initIndexLookupPath(resourceUrlProvider); + String prefix = url.substring(0, this.indexLookupPath); + String lookupPath = url.substring(this.indexLookupPath); + lookupPath = resourceUrlProvider.getForLookupPath(lookupPath); + return (lookupPath != null ? super.encodeURL(prefix + lookupPath) : super.encodeURL(url)); } private ResourceUrlProvider getResourceUrlProvider() { @@ -79,6 +85,13 @@ public class ResourceUrlEncodingFilter extends OncePerRequestFilter { return (ResourceUrlProvider) this.request.getAttribute(name); } + private void initIndexLookupPath(ResourceUrlProvider urlProvider) { + if (this.indexLookupPath == null) { + String requestUri = urlProvider.getPathHelper().getRequestUri(this.request); + String lookupPath = urlProvider.getPathHelper().getLookupPathForRequest(this.request); + this.indexLookupPath = requestUri.indexOf(lookupPath); + } + } } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderJavaConfigTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderJavaConfigTests.java index 620e29cbef5ed81cc7172c6f84d4b5473a3edb9d..6e9a46bdcb6817ea6dcfb77d3230db18f0c4d778 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderJavaConfigTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderJavaConfigTests.java @@ -79,7 +79,7 @@ public class ResourceUrlProviderJavaConfigTests { } @Test - public void resolvePathWithServletMappingByPrefix() throws Exception { + public void resolvePathWithServletMappedByPrefix() throws Exception { this.request.setRequestURI("/myapp/myservlet/index"); this.request.setServletPath("/myservlet"); this.filterChain.doFilter(this.request, this.response); @@ -88,6 +88,16 @@ public class ResourceUrlProviderJavaConfigTests { resolvePublicResourceUrlPath("/myapp/myservlet/resources/foo.css")); } + @Test + public void resolvePathNoMatch() throws Exception { + this.request.setRequestURI("/myapp/myservlet/index"); + this.request.setServletPath("/myservlet"); + this.filterChain.doFilter(this.request, this.response); + + assertEquals("/myapp/myservlet/index", resolvePublicResourceUrlPath("/myapp/myservlet/index")); + } + + private String resolvePublicResourceUrlPath(String path) { return this.servlet.wrappedResponse.encodeURL(path); }