Skip to content

Commit 6dc8e68

Browse files
committed
Align default tldScanPatterns with Tomcat's
Previously, we configured embedded Tomcat in such a way that no TLD scan patterns were configured. This differed from a standalone Tomcat installation where 4 patterns are configured that take precedence over some of the skip patterns. The missing scan patterns resulted in the skip patterns preventing the discovery of Log4j2's TLDs. This commit updates TomcatServletWebServerFactory to configure the same four scan patterns as standalone Tomcat configures by default. Fixes gh-23302
1 parent bf9d23e commit 6dc8e68

File tree

4 files changed

+179
-143
lines changed

4 files changed

+179
-143
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
/*
2+
* Copyright 2012-2020 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.web.embedded.tomcat;
18+
19+
import java.util.Collections;
20+
import java.util.LinkedHashSet;
21+
import java.util.Set;
22+
23+
/**
24+
* TLD skip and scan patterns used by Spring Boot.
25+
*
26+
* @author Phillip Webb
27+
* @author Andy Wilkinson
28+
*/
29+
final class TldPatterns {
30+
31+
private static final Set<String> TOMCAT_SKIP;
32+
33+
static {
34+
// Same as Tomcat
35+
Set<String> skipPatterns = new LinkedHashSet<>();
36+
skipPatterns.add("ant-*.jar");
37+
skipPatterns.add("aspectj*.jar");
38+
skipPatterns.add("commons-beanutils*.jar");
39+
skipPatterns.add("commons-codec*.jar");
40+
skipPatterns.add("commons-collections*.jar");
41+
skipPatterns.add("commons-dbcp*.jar");
42+
skipPatterns.add("commons-digester*.jar");
43+
skipPatterns.add("commons-fileupload*.jar");
44+
skipPatterns.add("commons-httpclient*.jar");
45+
skipPatterns.add("commons-io*.jar");
46+
skipPatterns.add("commons-lang*.jar");
47+
skipPatterns.add("commons-logging*.jar");
48+
skipPatterns.add("commons-math*.jar");
49+
skipPatterns.add("commons-pool*.jar");
50+
skipPatterns.add("geronimo-spec-jaxrpc*.jar");
51+
skipPatterns.add("h2*.jar");
52+
skipPatterns.add("hamcrest*.jar");
53+
skipPatterns.add("hibernate*.jar");
54+
skipPatterns.add("jaxb-runtime-*.jar");
55+
skipPatterns.add("jmx*.jar");
56+
skipPatterns.add("jmx-tools-*.jar");
57+
skipPatterns.add("jta*.jar");
58+
skipPatterns.add("junit-*.jar");
59+
skipPatterns.add("httpclient*.jar");
60+
skipPatterns.add("log4j-*.jar");
61+
skipPatterns.add("mail*.jar");
62+
skipPatterns.add("org.hamcrest*.jar");
63+
skipPatterns.add("slf4j*.jar");
64+
skipPatterns.add("tomcat-embed-core-*.jar");
65+
skipPatterns.add("tomcat-embed-logging-*.jar");
66+
skipPatterns.add("tomcat-jdbc-*.jar");
67+
skipPatterns.add("tomcat-juli-*.jar");
68+
skipPatterns.add("tools.jar");
69+
skipPatterns.add("wsdl4j*.jar");
70+
skipPatterns.add("xercesImpl-*.jar");
71+
skipPatterns.add("xmlParserAPIs-*.jar");
72+
skipPatterns.add("xml-apis-*.jar");
73+
TOMCAT_SKIP = Collections.unmodifiableSet(skipPatterns);
74+
}
75+
76+
private static final Set<String> ADDITIONAL_SKIP;
77+
78+
static {
79+
// Additional typical for Spring Boot applications
80+
Set<String> skipPatterns = new LinkedHashSet<>();
81+
skipPatterns.add("antlr-*.jar");
82+
skipPatterns.add("aopalliance-*.jar");
83+
skipPatterns.add("aspectjrt-*.jar");
84+
skipPatterns.add("aspectjweaver-*.jar");
85+
skipPatterns.add("classmate-*.jar");
86+
skipPatterns.add("dom4j-*.jar");
87+
skipPatterns.add("ecj-*.jar");
88+
skipPatterns.add("ehcache-core-*.jar");
89+
skipPatterns.add("hibernate-core-*.jar");
90+
skipPatterns.add("hibernate-commons-annotations-*.jar");
91+
skipPatterns.add("hibernate-entitymanager-*.jar");
92+
skipPatterns.add("hibernate-jpa-2.1-api-*.jar");
93+
skipPatterns.add("hibernate-validator-*.jar");
94+
skipPatterns.add("hsqldb-*.jar");
95+
skipPatterns.add("jackson-annotations-*.jar");
96+
skipPatterns.add("jackson-core-*.jar");
97+
skipPatterns.add("jackson-databind-*.jar");
98+
skipPatterns.add("jandex-*.jar");
99+
skipPatterns.add("javassist-*.jar");
100+
skipPatterns.add("jboss-logging-*.jar");
101+
skipPatterns.add("jboss-transaction-api_*.jar");
102+
skipPatterns.add("jcl-over-slf4j-*.jar");
103+
skipPatterns.add("jdom-*.jar");
104+
skipPatterns.add("jul-to-slf4j-*.jar");
105+
skipPatterns.add("log4j-over-slf4j-*.jar");
106+
skipPatterns.add("logback-classic-*.jar");
107+
skipPatterns.add("logback-core-*.jar");
108+
skipPatterns.add("rome-*.jar");
109+
skipPatterns.add("slf4j-api-*.jar");
110+
skipPatterns.add("spring-aop-*.jar");
111+
skipPatterns.add("spring-aspects-*.jar");
112+
skipPatterns.add("spring-beans-*.jar");
113+
skipPatterns.add("spring-boot-*.jar");
114+
skipPatterns.add("spring-core-*.jar");
115+
skipPatterns.add("spring-context-*.jar");
116+
skipPatterns.add("spring-data-*.jar");
117+
skipPatterns.add("spring-expression-*.jar");
118+
skipPatterns.add("spring-jdbc-*.jar,");
119+
skipPatterns.add("spring-orm-*.jar");
120+
skipPatterns.add("spring-oxm-*.jar");
121+
skipPatterns.add("spring-tx-*.jar");
122+
skipPatterns.add("snakeyaml-*.jar");
123+
skipPatterns.add("tomcat-embed-el-*.jar");
124+
skipPatterns.add("validation-api-*.jar");
125+
skipPatterns.add("xml-apis-*.jar");
126+
ADDITIONAL_SKIP = Collections.unmodifiableSet(skipPatterns);
127+
}
128+
129+
static final Set<String> DEFAULT_SKIP;
130+
131+
static {
132+
Set<String> skipPatterns = new LinkedHashSet<>();
133+
skipPatterns.addAll(TOMCAT_SKIP);
134+
skipPatterns.addAll(ADDITIONAL_SKIP);
135+
DEFAULT_SKIP = Collections.unmodifiableSet(skipPatterns);
136+
}
137+
138+
private static final Set<String> TOMCAT_SCAN;
139+
140+
static {
141+
Set<String> scanPatterns = new LinkedHashSet<>();
142+
scanPatterns.add("log4j-taglib*.jar");
143+
scanPatterns.add("log4j-web*.jar");
144+
scanPatterns.add("log4javascript*.jar");
145+
scanPatterns.add("slf4j-taglib*.jar");
146+
TOMCAT_SCAN = Collections.unmodifiableSet(scanPatterns);
147+
}
148+
149+
static final Set<String> DEFAULT_SCAN;
150+
151+
static {
152+
Set<String> scanPatterns = new LinkedHashSet<>();
153+
scanPatterns.addAll(TOMCAT_SCAN);
154+
DEFAULT_SCAN = Collections.unmodifiableSet(scanPatterns);
155+
}
156+
157+
private TldPatterns() {
158+
}
159+
160+
}

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/tomcat/TldSkipPatterns.java

Lines changed: 0 additions & 140 deletions
This file was deleted.

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactory.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,9 @@ public class TomcatServletWebServerFactory extends AbstractServletWebServerFacto
130130

131131
private String protocol = DEFAULT_PROTOCOL;
132132

133-
private Set<String> tldSkipPatterns = new LinkedHashSet<>(TldSkipPatterns.DEFAULT);
133+
private Set<String> tldSkipPatterns = new LinkedHashSet<>(TldPatterns.DEFAULT_SKIP);
134+
135+
private Set<String> tldScanPatterns = new LinkedHashSet<>(TldPatterns.DEFAULT_SCAN);
134136

135137
private Charset uriEncoding = DEFAULT_CHARSET;
136138

@@ -220,7 +222,7 @@ protected void prepareContext(Host host, ServletContextInitializer[] initializer
220222
catch (NoSuchMethodError ex) {
221223
// Tomcat is < 8.5.39. Continue.
222224
}
223-
configureTldSkipPatterns(context);
225+
configureTldPatterns(context);
224226
WebappLoader loader = new WebappLoader();
225227
loader.setLoaderClass(TomcatEmbeddedWebappClassLoader.class.getName());
226228
loader.setDelegate(true);
@@ -254,9 +256,10 @@ private void addLocaleMappings(TomcatEmbeddedContext context) {
254256
(locale, charset) -> context.addLocaleEncodingMappingParameter(locale.toString(), charset.toString()));
255257
}
256258

257-
private void configureTldSkipPatterns(TomcatEmbeddedContext context) {
259+
private void configureTldPatterns(TomcatEmbeddedContext context) {
258260
StandardJarScanFilter filter = new StandardJarScanFilter();
259261
filter.setTldSkip(StringUtils.collectionToCommaDelimitedString(this.tldSkipPatterns));
262+
filter.setTldScan(StringUtils.collectionToCommaDelimitedString(this.tldScanPatterns));
260263
context.getJarScanner().setJarScanFilter(filter);
261264
}
262265

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.apache.jasper.servlet.JspServlet;
5959
import org.apache.tomcat.JarScanFilter;
6060
import org.apache.tomcat.JarScanType;
61+
import org.apache.tomcat.util.scan.StandardJarScanFilter;
6162
import org.junit.jupiter.api.AfterEach;
6263
import org.junit.jupiter.api.Test;
6364
import org.mockito.ArgumentCaptor;
@@ -438,6 +439,18 @@ void tldSkipPatternsShouldBeAppliedToContextJarScanner() {
438439
assertThat(jarScanFilter.check(JarScanType.TLD, "test.jar")).isTrue();
439440
}
440441

442+
@Test
443+
void tldScanPatternsShouldBeAppliedToContextJarScanner() {
444+
TomcatServletWebServerFactory factory = getFactory();
445+
this.webServer = factory.getWebServer();
446+
this.webServer.start();
447+
Tomcat tomcat = ((TomcatWebServer) this.webServer).getTomcat();
448+
Context context = (Context) tomcat.getHost().findChildren()[0];
449+
JarScanFilter jarScanFilter = context.getJarScanner().getJarScanFilter();
450+
String tldScan = ((StandardJarScanFilter) jarScanFilter).getTldScan();
451+
assertThat(tldScan).isEqualTo("log4j-taglib*.jar,log4j-web*.jar,log4javascript*.jar,slf4j-taglib*.jar");
452+
}
453+
441454
@Test
442455
void customTomcatHttpOnlyCookie() {
443456
TomcatServletWebServerFactory factory = getFactory();

0 commit comments

Comments
 (0)