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 24f0a24929f..84523adb127 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 @@ -101,6 +101,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 static class TestResourceTransformerSupport extends ResourceTransformerSupport { 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 2c78cbd8e9f..3069f94ffa2 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 @@ -94,6 +94,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 static class TestResourceTransformerSupport extends ResourceTransformerSupport {