Skip to content

Commit 570b292

Browse files
committed
Disable JspServlet's development mode by default
This commit switches off the auto-configured JspServlet's development mode by default. Development mode is then switched on when DevTools is on the class path. Closes gh-7039
1 parent c2d97c9 commit 570b292

File tree

8 files changed

+89
-36
lines changed

8 files changed

+89
-36
lines changed

spring-boot-devtools/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@
117117
<artifactId>tomcat-embed-core</artifactId>
118118
<scope>test</scope>
119119
</dependency>
120+
<dependency>
121+
<groupId>org.apache.tomcat.embed</groupId>
122+
<artifactId>tomcat-embed-jasper</artifactId>
123+
<scope>test</scope>
124+
</dependency>
120125
<dependency>
121126
<groupId>org.eclipse.jetty.websocket</groupId>
122127
<artifactId>websocket-client</artifactId>

spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public class DevToolsPropertyDefaultsPostProcessor implements EnvironmentPostPro
5252
properties.put("spring.resources.cache-period", "0");
5353
properties.put("spring.template.provider.cache", "false");
5454
properties.put("spring.mvc.log-resolved-exception", "true");
55+
properties.put("server.jsp-servlet.init-parameters.development", "true");
5556
PROPERTIES = Collections.unmodifiableMap(properties);
5657
}
5758

spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfigurationTests.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
import java.util.HashMap;
2222
import java.util.Map;
2323

24+
import org.apache.catalina.Container;
25+
import org.apache.catalina.core.StandardWrapper;
26+
import org.apache.jasper.EmbeddedServletOptions;
2427
import org.junit.After;
2528
import org.junit.Rule;
2629
import org.junit.Test;
@@ -30,7 +33,12 @@
3033
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
3134
import org.springframework.boot.SpringApplication;
3235
import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration;
36+
import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration;
3337
import org.springframework.boot.autoconfigure.web.ResourceProperties;
38+
import org.springframework.boot.autoconfigure.web.ServerProperties;
39+
import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext;
40+
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer;
41+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3442
import org.springframework.boot.devtools.classpath.ClassPathChangedEvent;
3543
import org.springframework.boot.devtools.classpath.ClassPathFileSystemWatcher;
3644
import org.springframework.boot.devtools.filewatch.ChangedFiles;
@@ -234,6 +242,18 @@ public void watchingAdditionalPaths() throws Exception {
234242
.containsKey(new File("src/test/java").getAbsoluteFile());
235243
}
236244

245+
@Test
246+
public void devToolsSwitchesJspServletToDevelopmentMode() {
247+
this.context = initializeAndRun(Config.class);
248+
TomcatEmbeddedServletContainer tomcatContainer = (TomcatEmbeddedServletContainer) ((EmbeddedWebApplicationContext) this.context)
249+
.getEmbeddedServletContainer();
250+
Container context = tomcatContainer.getTomcat().getHost().findChildren()[0];
251+
StandardWrapper jspServletWrapper = (StandardWrapper) context.findChild("jsp");
252+
EmbeddedServletOptions options = (EmbeddedServletOptions) ReflectionTestUtils
253+
.getField(jspServletWrapper.getServlet(), "options");
254+
assertThat(options.getDevelopment()).isEqualTo(true);
255+
}
256+
237257
private ConfigurableApplicationContext initializeAndRun(Class<?> config,
238258
String... args) {
239259
return initializeAndRun(config, Collections.<String, Object>emptyMap(), args);
@@ -244,7 +264,6 @@ private ConfigurableApplicationContext initializeAndRun(Class<?> config,
244264
Restarter.initialize(new String[0], false, new MockRestartInitializer(), false);
245265
SpringApplication application = new SpringApplication(config);
246266
application.setDefaultProperties(getDefaultProperties(properties));
247-
application.setWebEnvironment(false);
248267
ConfigurableApplicationContext context = application.run(args);
249268
return context;
250269
}
@@ -254,18 +273,22 @@ private Map<String, Object> getDefaultProperties(
254273
Map<String, Object> properties = new HashMap<String, Object>();
255274
properties.put("spring.thymeleaf.check-template-location", false);
256275
properties.put("spring.devtools.livereload.port", this.liveReloadPort);
276+
properties.put("server.port", 0);
257277
properties.putAll(specifiedProperties);
258278
return properties;
259279
}
260280

261281
@Configuration
262-
@Import({ LocalDevToolsAutoConfiguration.class, ThymeleafAutoConfiguration.class })
282+
@Import({ EmbeddedServletContainerAutoConfiguration.class,
283+
LocalDevToolsAutoConfiguration.class, ThymeleafAutoConfiguration.class })
284+
@EnableConfigurationProperties(ServerProperties.class)
263285
public static class Config {
264286

265287
}
266288

267289
@Configuration
268-
@Import({ LocalDevToolsAutoConfiguration.class, ThymeleafAutoConfiguration.class })
290+
@Import({ EmbeddedServletContainerAutoConfiguration.class,
291+
LocalDevToolsAutoConfiguration.class, ThymeleafAutoConfiguration.class })
269292
public static class ConfigWithMockLiveReload {
270293

271294
@Bean
@@ -276,7 +299,8 @@ public LiveReloadServer liveReloadServer() {
276299
}
277300

278301
@Configuration
279-
@Import({ LocalDevToolsAutoConfiguration.class, ResourceProperties.class })
302+
@Import({ EmbeddedServletContainerAutoConfiguration.class,
303+
LocalDevToolsAutoConfiguration.class, ResourceProperties.class })
280304
public static class WebResourcesConfig {
281305

282306
}

spring-boot/src/main/java/org/springframework/boot/context/embedded/JspServlet.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2015 the original author or authors.
2+
* Copyright 2012-2016 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ public class JspServlet {
3636
private String className = "org.apache.jasper.servlet.JspServlet";
3737

3838
/**
39-
* Init parameters use to configure the JSP servlet.
39+
* Init parameters used to configure the JSP servlet.
4040
*/
4141
private Map<String, String> initParameters = new HashMap<String, String>();
4242

@@ -46,6 +46,10 @@ public class JspServlet {
4646
*/
4747
private boolean registered = true;
4848

49+
public JspServlet() {
50+
this.initParameters.put("development", "false");
51+
}
52+
4953
public String getClassName() {
5054
return this.className;
5155
}

spring-boot/src/test/java/org/springframework/boot/context/embedded/AbstractEmbeddedServletContainerFactoryTests.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,11 @@
6767
import org.apache.http.impl.client.HttpClients;
6868
import org.apache.http.protocol.HttpContext;
6969
import org.apache.http.ssl.SSLContextBuilder;
70+
import org.apache.jasper.EmbeddedServletOptions;
71+
import org.apache.jasper.servlet.JspServlet;
7072
import org.junit.After;
7173
import org.junit.AfterClass;
74+
import org.junit.Assume;
7275
import org.junit.BeforeClass;
7376
import org.junit.Rule;
7477
import org.junit.Test;
@@ -98,6 +101,7 @@
98101
import org.springframework.util.concurrent.ListenableFuture;
99102

100103
import static org.assertj.core.api.Assertions.assertThat;
104+
import static org.hamcrest.CoreMatchers.notNullValue;
101105
import static org.junit.Assert.fail;
102106
import static org.mockito.BDDMockito.given;
103107
import static org.mockito.Matchers.anyObject;
@@ -883,6 +887,29 @@ public void localeCharsetMappingsAreConfigured() throws Exception {
883887
assertThat(getCharset(Locale.ITALIAN)).isNull();
884888
}
885889

890+
@Test
891+
public void jspServletInitParameters() throws Exception {
892+
Map<String, String> initParameters = new HashMap<String, String>();
893+
initParameters.put("a", "alpha");
894+
AbstractEmbeddedServletContainerFactory factory = getFactory();
895+
factory.getJspServlet().setInitParameters(initParameters);
896+
this.container = factory.getEmbeddedServletContainer();
897+
Assume.assumeThat(getJspServlet(), notNullValue());
898+
JspServlet jspServlet = getJspServlet();
899+
assertThat(jspServlet.getInitParameter("a")).isEqualTo("alpha");
900+
}
901+
902+
@Test
903+
public void jspServletIsNotInDevelopmentModeByDefault() throws Exception {
904+
AbstractEmbeddedServletContainerFactory factory = getFactory();
905+
this.container = factory.getEmbeddedServletContainer();
906+
Assume.assumeThat(getJspServlet(), notNullValue());
907+
JspServlet jspServlet = getJspServlet();
908+
EmbeddedServletOptions options = (EmbeddedServletOptions) ReflectionTestUtils
909+
.getField(jspServlet, "options");
910+
assertThat(options.getDevelopment()).isEqualTo(false);
911+
}
912+
886913
protected abstract void addConnector(int port,
887914
AbstractEmbeddedServletContainerFactory factory);
888915

@@ -1032,7 +1059,8 @@ protected void assertForwardHeaderIsUsed(EmbeddedServletContainerFactory factory
10321059

10331060
protected abstract AbstractEmbeddedServletContainerFactory getFactory();
10341061

1035-
protected abstract Object getJspServlet();
1062+
protected abstract org.apache.jasper.servlet.JspServlet getJspServlet()
1063+
throws Exception;
10361064

10371065
protected ServletContextInitializer exampleServletRegistration() {
10381066
return new ServletRegistrationBean(new ExampleServlet(), "/hello");

spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.io.IOException;
2020
import java.nio.charset.Charset;
2121
import java.util.Arrays;
22-
import java.util.HashMap;
2322
import java.util.Locale;
2423
import java.util.Map;
2524
import java.util.concurrent.TimeUnit;
@@ -29,6 +28,7 @@
2928
import javax.servlet.http.HttpServletRequest;
3029
import javax.servlet.http.HttpServletResponse;
3130

31+
import org.apache.jasper.servlet.JspServlet;
3232
import org.eclipse.jetty.server.Handler;
3333
import org.eclipse.jetty.server.Server;
3434
import org.eclipse.jetty.server.ServerConnector;
@@ -246,16 +246,6 @@ public void basicSslClasspathKeyStore() throws Exception {
246246
testBasicSslWithKeyStore("classpath:test.jks");
247247
}
248248

249-
@Test
250-
public void jspServletInitParameters() {
251-
JettyEmbeddedServletContainerFactory factory = getFactory();
252-
Map<String, String> initParameters = new HashMap<String, String>();
253-
initParameters.put("a", "alpha");
254-
factory.getJspServlet().setInitParameters(initParameters);
255-
this.container = factory.getEmbeddedServletContainer();
256-
assertThat(getJspServlet().getInitParameters()).isEqualTo(initParameters);
257-
}
258-
259249
@Test
260250
public void useForwardHeaders() throws Exception {
261251
JettyEmbeddedServletContainerFactory factory = getFactory();
@@ -316,10 +306,15 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
316306
}
317307

318308
@Override
319-
protected ServletHolder getJspServlet() {
309+
protected JspServlet getJspServlet() throws Exception {
320310
WebAppContext context = (WebAppContext) ((JettyEmbeddedServletContainer) this.container)
321311
.getServer().getHandler();
322-
return context.getServletHandler().getServlet("jsp");
312+
ServletHolder holder = context.getServletHandler().getServlet("jsp");
313+
if (holder == null) {
314+
return null;
315+
}
316+
holder.start();
317+
return (JspServlet) holder.getServlet();
323318
}
324319

325320
@Override

spring-boot/src/test/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactoryTests.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
import java.io.IOException;
2121
import java.nio.charset.Charset;
2222
import java.util.Arrays;
23-
import java.util.HashMap;
2423
import java.util.Locale;
2524
import java.util.Map;
2625
import java.util.concurrent.TimeUnit;
2726

2827
import javax.naming.InitialContext;
2928
import javax.naming.NamingException;
29+
import javax.servlet.ServletException;
3030

3131
import org.apache.catalina.Container;
3232
import org.apache.catalina.Context;
@@ -36,11 +36,12 @@
3636
import org.apache.catalina.Service;
3737
import org.apache.catalina.SessionIdGenerator;
3838
import org.apache.catalina.Valve;
39-
import org.apache.catalina.Wrapper;
4039
import org.apache.catalina.connector.Connector;
40+
import org.apache.catalina.core.StandardWrapper;
4141
import org.apache.catalina.startup.Tomcat;
4242
import org.apache.catalina.util.CharsetMapper;
4343
import org.apache.catalina.valves.RemoteIpValve;
44+
import org.apache.jasper.servlet.JspServlet;
4445
import org.apache.tomcat.util.net.SSLHostConfig;
4546
import org.junit.After;
4647
import org.junit.Rule;
@@ -359,17 +360,6 @@ protected void addConnector(int port,
359360
.addAdditionalTomcatConnectors(connector);
360361
}
361362

362-
@Test
363-
public void jspServletInitParameters() {
364-
Map<String, String> initParameters = new HashMap<String, String>();
365-
initParameters.put("a", "alpha");
366-
TomcatEmbeddedServletContainerFactory factory = getFactory();
367-
factory.getJspServlet().setInitParameters(initParameters);
368-
this.container = factory.getEmbeddedServletContainer();
369-
Wrapper jspServlet = getJspServlet();
370-
assertThat(jspServlet.findInitParameter("a")).isEqualTo("alpha");
371-
}
372-
373363
@Test
374364
public void useForwardHeaders() throws Exception {
375365
TomcatEmbeddedServletContainerFactory factory = getFactory();
@@ -462,10 +452,15 @@ public void sessionIdGeneratorIsConfiguredWithAttributesFromTheManager() {
462452
}
463453

464454
@Override
465-
protected Wrapper getJspServlet() {
455+
protected JspServlet getJspServlet() throws ServletException {
466456
Container context = ((TomcatEmbeddedServletContainer) this.container).getTomcat()
467457
.getHost().findChildren()[0];
468-
return (Wrapper) context.findChild("jsp");
458+
StandardWrapper standardWrapper = (StandardWrapper) context.findChild("jsp");
459+
if (standardWrapper == null) {
460+
return null;
461+
}
462+
standardWrapper.load();
463+
return (JspServlet) standardWrapper.getServlet();
469464
}
470465

471466
@SuppressWarnings("unchecked")

spring-boot/src/test/java/org/springframework/boot/context/embedded/undertow/UndertowEmbeddedServletContainerFactoryTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import io.undertow.servlet.api.DeploymentInfo;
3535
import io.undertow.servlet.api.DeploymentManager;
3636
import io.undertow.servlet.api.ServletContainer;
37+
import org.apache.jasper.servlet.JspServlet;
3738
import org.junit.Test;
3839
import org.mockito.InOrder;
3940

@@ -250,7 +251,7 @@ public void sslRestrictedProtocolsRSATLS11Failure() throws Exception {
250251
}
251252

252253
@Override
253-
protected Object getJspServlet() {
254+
protected JspServlet getJspServlet() {
254255
return null; // Undertow does not support JSPs
255256
}
256257

0 commit comments

Comments
 (0)