diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java index 8beaf67c5aa..63c096d9707 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java @@ -96,7 +96,7 @@ public abstract class ResourceTransformerSupport implements ResourceTransformer */ protected String toAbsolutePath(String path, ServerWebExchange exchange) { String requestPath = exchange.getRequest().getURI().getPath(); - String absolutePath = StringUtils.applyRelativePath(requestPath, path); + String absolutePath = path.startsWith("/") ? path : StringUtils.applyRelativePath(requestPath, path); return StringUtils.cleanPath(absolutePath); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceTransformerSupportTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceTransformerSupportTests.java index 78a6cd1a613..2662196e771 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceTransformerSupportTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceTransformerSupportTests.java @@ -106,6 +106,16 @@ public class ResourceTransformerSupportTests { assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual); } + @Test + public void toAbsolutePath() { + MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/resources/main.css")); + String absolute = this.transformer.toAbsolutePath("img/image.png", exchange); + assertEquals("/resources/img/image.png", absolute); + + absolute = this.transformer.toAbsolutePath("/img/image.png", exchange); + assertEquals("/img/image.png", absolute); + } + private Resource getResource(String filePath) { return new ClassPathResource("test/" + filePath, getClass()); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java index b32fbae5315..98ec607d5d9 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java @@ -94,10 +94,13 @@ public abstract class ResourceTransformerSupport implements ResourceTransformer * @return the absolute request path for the given resource path */ protected String toAbsolutePath(String path, HttpServletRequest request) { - ResourceUrlProvider urlProvider = findResourceUrlProvider(request); - Assert.state(urlProvider != null, "No ResourceUrlProvider"); - String requestPath = urlProvider.getUrlPathHelper().getRequestUri(request); - String absolutePath = StringUtils.applyRelativePath(requestPath, path); + String absolutePath = path; + if(!path.startsWith("/")) { + ResourceUrlProvider urlProvider = findResourceUrlProvider(request); + Assert.state(urlProvider != null, "No ResourceUrlProvider"); + String requestPath = urlProvider.getUrlPathHelper().getRequestUri(request); + absolutePath = StringUtils.applyRelativePath(requestPath, path); + } return StringUtils.cleanPath(absolutePath); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java index 33b807ac854..c18fc08601f 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java @@ -41,7 +41,7 @@ public class ResourceTransformerSupportTests { private TestResourceTransformerSupport transformer; - private final MockHttpServletRequest request = new MockHttpServletRequest("GET", ""); + private final MockHttpServletRequest request = new MockHttpServletRequest("GET", "/"); @Before @@ -98,6 +98,17 @@ public class ResourceTransformerSupportTests { assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual); } + @Test + public void toAbsolutePath() { + String absolute = this.transformer.toAbsolutePath("img/image.png", + new MockHttpServletRequest("GET", "/resources/style.css")); + assertEquals("/resources/img/image.png", absolute); + + absolute = this.transformer.toAbsolutePath("/img/image.png", + new MockHttpServletRequest("GET", "/resources/style.css")); + assertEquals("/img/image.png", absolute); + } + private Resource getResource(String filePath) { return new ClassPathResource("test/" + filePath, getClass()); }