From 5fb2060566b0e208830cff4c739a7bb1eb0cff40 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 24 Jul 2018 11:18:52 +0200 Subject: [PATCH] Polish "Add configuration for Tomcat's cachingAllowed property" Closes gh-13614 --- .../autoconfigure/web/ServerProperties.java | 43 ++++++------------- .../TomcatWebServerFactoryCustomizer.java | 30 +++---------- ...TomcatWebServerFactoryCustomizerTests.java | 28 ++++++------ .../appendix-application-properties.adoc | 2 +- 4 files changed, 33 insertions(+), 70 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java index d3490ec879..b943184bda 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java @@ -52,7 +52,6 @@ import org.springframework.util.StringUtils; * @author Aurélien Leboulanger * @author Brian Clozel * @author Olivier Lamy - * @author Rob Tompkins */ @ConfigurationProperties(prefix = "server", ignoreUnknownFields = true) public class ServerProperties { @@ -266,11 +265,6 @@ public class ServerProperties { */ private final Accesslog accesslog = new Accesslog(); - /** - * Web resource configuration. - */ - private final WebResource webResource = new WebResource(); - /** * Regular expression matching trusted IP addresses. */ @@ -405,10 +399,6 @@ public class ServerProperties { return this.accesslog; } - public WebResource getWebResource() { - return this.webResource; - } - public Duration getBackgroundProcessorDelay() { return this.backgroundProcessorDelay; } @@ -525,26 +515,6 @@ public class ServerProperties { return this.resource; } - /** - * Tomcat web resource properties. - */ - public static class WebResource { - - /** - * Whether tomcat WebResource caching is permitted for this web application. - */ - private Boolean useCaching = Boolean.TRUE; - - public Boolean getUseCaching() { - return this.useCaching; - } - - public void setUseCaching(Boolean useCaching) { - this.useCaching = useCaching; - } - - } - /** * Tomcat access log properties. */ @@ -690,11 +660,24 @@ public class ServerProperties { */ public static class Resource { + /** + * Whether static resource caching is permitted for this web application. + */ + private boolean allowCaching = true; + /** * Time-to-live of the static resource cache. */ private Duration cacheTtl; + public boolean isAllowCaching() { + return this.allowCaching; + } + + public void setAllowCaching(boolean allowCaching) { + this.allowCaching = allowCaching; + } + public Duration getCacheTtl() { return this.cacheTtl; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizer.java index 12369ef899..8df3d8db5c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizer.java @@ -19,11 +19,9 @@ package org.springframework.boot.autoconfigure.web.embedded; import java.time.Duration; import org.apache.catalina.Lifecycle; -import org.apache.catalina.WebResourceRoot; import org.apache.catalina.valves.AccessLogValve; import org.apache.catalina.valves.ErrorReportValve; import org.apache.catalina.valves.RemoteIpValve; -import org.apache.catalina.webresources.StandardRoot; import org.apache.coyote.AbstractProtocol; import org.apache.coyote.ProtocolHandler; import org.apache.coyote.http11.AbstractHttp11Protocol; @@ -48,7 +46,6 @@ import org.springframework.util.StringUtils; * @author Yulin Qin * @author Stephane Nicoll * @author Phillip Webb - * @author Rob Tompkins * @since 2.0.0 */ public class TomcatWebServerFactoryCustomizer implements @@ -73,8 +70,6 @@ public class TomcatWebServerFactoryCustomizer implements public void customize(ConfigurableTomcatWebServerFactory factory) { ServerProperties properties = this.serverProperties; ServerProperties.Tomcat tomcatProperties = properties.getTomcat(); - ServerProperties.Tomcat.WebResource tomcatWebResourceProperties = tomcatProperties - .getWebResource(); PropertyMapper propertyMapper = PropertyMapper.get(); propertyMapper.from(tomcatProperties::getBasedir).whenNonNull() .to(factory::setBaseDirectory); @@ -106,9 +101,6 @@ public class TomcatWebServerFactoryCustomizer implements .to((maxConnections) -> customizeMaxConnections(factory, maxConnections)); propertyMapper.from(tomcatProperties::getAcceptCount).when(this::isPositive) .to((acceptCount) -> customizeAcceptCount(factory, acceptCount)); - propertyMapper.from(tomcatWebResourceProperties::getUseCaching).whenFalse() - .to((isWebResourceCachingAllowed) -> customizeWebResourceCaching(factory, - isWebResourceCachingAllowed)); customizeStaticResources(factory); customizeErrorReportValve(properties.getError(), factory); } @@ -134,18 +126,6 @@ public class TomcatWebServerFactoryCustomizer implements }); } - private void customizeWebResourceCaching(ConfigurableTomcatWebServerFactory factory, - Boolean useWebResourceCaching) { - factory.addContextCustomizers((context) -> { - WebResourceRoot webResourceRoot = context.getResources(); - if (webResourceRoot == null) { - webResourceRoot = new StandardRoot(context); - } - webResourceRoot.setCachingAllowed(useWebResourceCaching); - context.setResources(webResourceRoot); - }); - } - private void customizeMaxConnections(ConfigurableTomcatWebServerFactory factory, int maxConnections) { factory.addConnectorCustomizers((connector) -> { @@ -261,14 +241,14 @@ public class TomcatWebServerFactoryCustomizer implements private void customizeStaticResources(ConfigurableTomcatWebServerFactory factory) { ServerProperties.Tomcat.Resource resource = this.serverProperties.getTomcat() .getResource(); - if (resource.getCacheTtl() == null) { - return; - } factory.addContextCustomizers((context) -> { context.addLifecycleListener((event) -> { if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) { - long ttl = resource.getCacheTtl().toMillis(); - context.getResources().setCacheTtl(ttl); + context.getResources().setCachingAllowed(resource.isAllowCaching()); + if (resource.getCacheTtl() != null) { + long ttl = resource.getCacheTtl().toMillis(); + context.getResources().setCacheTtl(ttl); + } } }); }); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizerTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizerTests.java index c426ae9030..ce43fac13d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizerTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizerTests.java @@ -99,20 +99,6 @@ public class TomcatWebServerFactoryCustomizerTests { .isEqualTo(5)); } - @Test - public void turnOffWebResourceCaching() { - bind("server.tomcat.webresource.use-caching=false"); - customizeAndRunServer((server) -> { - Mapper mapper = server.getTomcat().getService().getMapper(); - Object contextObjectToContextVersionMap = ReflectionTestUtils.getField(mapper, - "contextObjectToContextVersionMap"); - Object tomcatEmbeddedContext = ((Map) contextObjectToContextVersionMap) - .values().toArray()[0]; - assertThat(((StandardRoot) ReflectionTestUtils.getField(tomcatEmbeddedContext, - "resources")).isCachingAllowed()).isFalse(); - }); - } - @Test public void customMaxHttpPostSize() { bind("server.tomcat.max-http-post-size=10000"); @@ -140,6 +126,20 @@ public class TomcatWebServerFactoryCustomizerTests { assertThat(remoteIpValve.getInternalProxies()).isEqualTo("192.168.0.1"); } + @Test + public void customStaticResourceAllowCaching() { + bind("server.tomcat.resource.allow-caching=false"); + customizeAndRunServer((server) -> { + Mapper mapper = server.getTomcat().getService().getMapper(); + Object contextObjectToContextVersionMap = ReflectionTestUtils.getField(mapper, + "contextObjectToContextVersionMap"); + Object tomcatEmbeddedContext = ((Map) contextObjectToContextVersionMap) + .values().toArray()[0]; + assertThat(((StandardRoot) ReflectionTestUtils.getField(tomcatEmbeddedContext, + "resources")).isCachingAllowed()).isFalse(); + }); + } + @Test public void customStaticResourceCacheTtl() { bind("server.tomcat.resource.cache-ttl=10000"); diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 98bddec845..a149580bdb 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -259,10 +259,10 @@ content into your application. Rather, pick only the properties that you need. server.tomcat.protocol-header-https-value=https # Value of the protocol header indicating whether the incoming request uses SSL. server.tomcat.redirect-context-root= # Whether requests to the context root should be redirected by appending a / to the path. server.tomcat.remote-ip-header= # Name of the HTTP header from which the remote IP is extracted. For instance, `X-FORWARDED-FOR`. + server.tomcat.resource.allow-caching= # Whether static resource caching is permitted for this web application. server.tomcat.resource.cache-ttl= # Time-to-live of the static resource cache. server.tomcat.uri-encoding=UTF-8 # Character encoding to use to decode the URI. server.tomcat.use-relative-redirects= # Whether HTTP 1.1 and later location headers generated by a call to sendRedirect will use relative or absolute redirects. - server.tomcat.webresource.use-caching= # Whether tomcat WebResource caching is permitted for this web application. server.undertow.accesslog.dir= # Undertow access log directory. server.undertow.accesslog.enabled=false # Whether to enable the access log. server.undertow.accesslog.pattern=common # Format pattern for access logs.