This is an automated email from the ASF dual-hosted git repository.

markt-asf pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/9.0.x by this push:
     new 0530321c97 Switch to using String.strip() rather than String.trim() as 
appropriate
0530321c97 is described below

commit 0530321c975c7c6bb7c8973815e3b41a6726df5b
Author: Mark Thomas <[email protected]>
AuthorDate: Wed Oct 28 12:36:55 2026 +0000

    Switch to using String.strip() rather than String.trim() as appropriate
    
    String.strip() isn't available for Java 8 so use JreCompat
---
 java/javax/el/ELProcessor.java                        | 18 ++++++++++--------
 java/javax/el/ExpressionFactory.java                  |  8 ++++----
 .../catalina/authenticator/AuthenticatorBase.java     |  7 +++++--
 .../apache/catalina/authenticator/SingleSignOn.java   |  3 ++-
 java/org/apache/catalina/core/StandardContext.java    |  2 +-
 java/org/apache/catalina/core/StandardHost.java       |  3 ++-
 java/org/apache/catalina/filters/CorsFilter.java      |  5 +++--
 .../apache/catalina/filters/CsrfPreventionFilter.java |  9 +++++----
 java/org/apache/catalina/filters/ExpiresFilter.java   |  6 ++++--
 java/org/apache/catalina/filters/RateLimitFilter.java |  3 ++-
 .../catalina/filters/RestCsrfPreventionFilter.java    |  5 ++++-
 java/org/apache/catalina/ha/backend/TcpSender.java    |  3 ++-
 .../apache/catalina/manager/HTMLManagerServlet.java   |  3 ++-
 java/org/apache/catalina/realm/DataSourceRealm.java   |  5 +++--
 java/org/apache/catalina/realm/JDBCRealm.java         |  5 +++--
 java/org/apache/catalina/realm/JNDIRealm.java         |  8 +++++---
 java/org/apache/catalina/realm/MemoryRealm.java       |  5 +++--
 java/org/apache/catalina/realm/RealmBase.java         |  5 +++--
 .../apache/catalina/security/SecurityListener.java    |  3 ++-
 java/org/apache/catalina/servlets/CGIServlet.java     |  5 +++--
 java/org/apache/catalina/servlets/DefaultServlet.java |  5 +++--
 java/org/apache/catalina/session/JDBCStore.java       |  3 ++-
 java/org/apache/catalina/ssi/ExpressionTokenizer.java |  4 +++-
 java/org/apache/catalina/ssi/SSIProcessor.java        |  3 ++-
 .../apache/catalina/startup/WebappServiceLoader.java  |  3 ++-
 .../catalina/storeconfig/XMLFormatPreserver.java      | 14 +++++++++-----
 .../apache/catalina/users/DataSourceUserDatabase.java |  3 ++-
 .../org/apache/catalina/users/MemoryUserDatabase.java | 13 +++++++------
 java/org/apache/catalina/util/ManifestResource.java   |  4 +++-
 .../apache/catalina/valves/ParameterLimitValve.java   |  7 ++++---
 .../valves/rewrite/RandomizedTextRewriteMap.java      |  5 +++--
 .../apache/catalina/valves/rewrite/ResolverImpl.java  |  5 +++--
 java/org/apache/coyote/CompressionConfig.java         |  7 ++++---
 java/org/apache/coyote/http2/Http2Protocol.java       |  3 ++-
 java/org/apache/jasper/compiler/ELParser.java         |  3 ++-
 java/org/apache/jasper/compiler/Generator.java        |  4 ++--
 java/org/apache/jasper/compiler/JavacErrorDetail.java |  3 ++-
 java/org/apache/jasper/compiler/Node.java             | 19 ++++++++++---------
 java/org/apache/jasper/compiler/SmapUtil.java         |  3 ++-
 java/org/apache/jasper/compiler/Validator.java        |  7 ++++---
 java/org/apache/jasper/tagplugins/jstl/Util.java      |  5 +++--
 .../tomcat/util/buf/EncodedSolidusHandling.java       |  3 ++-
 java/org/apache/tomcat/util/buf/StringUtils.java      |  4 +++-
 .../apache/tomcat/util/descriptor/tld/TldRuleSet.java |  3 ++-
 .../util/descriptor/web/SecurityConstraint.java       | 12 ++++++++----
 .../apache/tomcat/util/descriptor/web/WebRuleSet.java |  5 +++--
 .../apache/tomcat/util/digester/CallMethodRule.java   |  3 ++-
 .../apache/tomcat/util/digester/CallParamRule.java    |  3 ++-
 java/org/apache/tomcat/util/digester/Digester.java    |  3 ++-
 .../apache/tomcat/util/http/CookiesWithoutEquals.java |  3 ++-
 java/org/apache/tomcat/util/net/SSLHostConfig.java    | 17 +++++++++--------
 .../tomcat/util/scan/StandardJarScanFilter.java       |  3 ++-
 .../apache/tomcat/util/scan/StandardJarScanner.java   |  2 +-
 .../catalina/tribes/demos/CoordinationDemo.java       |  7 ++++---
 .../catalina/valves/TestExtendedAccessLogValve.java   |  5 +++--
 .../catalina/webresources/TestFileResource.java       |  4 +++-
 test/org/apache/el/TesterFunctions.java               |  4 +++-
 .../apache/jasper/compiler/TestEncodingDetector.java  |  3 ++-
 test/org/apache/jasper/compiler/TestGenerator.java    |  4 ++--
 test/org/apache/jasper/compiler/TestJspUtil.java      |  3 ++-
 .../org/apache/juli/TestPerWebappJuliIntegration.java |  5 +++--
 test/org/apache/naming/TestEnvEntry.java              |  5 +++--
 .../util/net/openssl/ciphers/TesterOpenSSL.java       |  5 +++--
 webapps/docs/changelog.xml                            |  8 ++++++++
 64 files changed, 216 insertions(+), 132 deletions(-)

diff --git a/java/javax/el/ELProcessor.java b/java/javax/el/ELProcessor.java
index 74496143ff..15afc9920e 100644
--- a/java/javax/el/ELProcessor.java
+++ b/java/javax/el/ELProcessor.java
@@ -209,10 +209,10 @@ public class ELProcessor {
             int paramIndex = methodName.indexOf('(');
 
             if (paramIndex == -1) {
-                name = methodName.trim();
+                name = JreCompat.getInstance().strip(methodName);
                 parameterTypeNames = null;
             } else {
-                String returnTypeAndName = methodName.substring(0, 
paramIndex).trim();
+                String returnTypeAndName = 
JreCompat.getInstance().strip(methodName.substring(0, paramIndex));
                 // Assume that the return type and the name are separated by
                 // whitespace. Given the use of trim() above, there should only
                 // be one sequence of whitespace characters.
@@ -226,27 +226,28 @@ public class ELProcessor {
                 if (wsPos == -1) {
                     throw new NoSuchMethodException();
                 }
-                name = returnTypeAndName.substring(wsPos).trim();
+                name = 
JreCompat.getInstance().strip(returnTypeAndName.substring(wsPos));
 
-                String paramString = methodName.substring(paramIndex).trim();
+                String paramString = 
JreCompat.getInstance().strip(methodName.substring(paramIndex));
                 // We know the params start with '(', check they end with ')'
                 if (!paramString.endsWith(")")) {
                     throw new NoSuchMethodException(Util.message(context,
                             "elProcessor.defineFunctionInvalidParameterList", 
paramString, methodName, className));
                 }
                 // Trim '(' and ')'
-                paramString = paramString.substring(1, paramString.length() - 
1).trim();
+                paramString = 
JreCompat.getInstance().strip(paramString.substring(1, paramString.length() - 
1));
                 if (paramString.length() == 0) {
                     parameterTypeNames = EMPTY_STRING_ARRAY;
                 } else {
                     parameterTypeNames = paramString.split(",");
                     ImportHandler importHandler = context.getImportHandler();
                     for (int i = 0; i < parameterTypeNames.length; i++) {
-                        String parameterTypeName = 
parameterTypeNames[i].trim();
+                        String parameterTypeName = 
JreCompat.getInstance().strip(parameterTypeNames[i]);
                         int dimension = 0;
                         int bracketPos = parameterTypeName.indexOf('[');
                         if (bracketPos > -1) {
-                            String parameterTypeNameOnly = 
parameterTypeName.substring(0, bracketPos).trim();
+                            String parameterTypeNameOnly = 
JreCompat.getInstance().strip(
+                                    parameterTypeName.substring(0, 
bracketPos));
                             while (bracketPos > -1) {
                                 dimension++;
                                 bracketPos = parameterTypeName.indexOf('[', 
bracketPos + 1);
@@ -257,7 +258,8 @@ public class ELProcessor {
                         if (parameterTypeName.endsWith("...")) {
                             varArgs = true;
                             dimension = 1;
-                            parameterTypeName = parameterTypeName.substring(0, 
parameterTypeName.length() - 3).trim();
+                            parameterTypeName = JreCompat.getInstance()
+                                    .strip(parameterTypeName.substring(0, 
parameterTypeName.length() - 3));
                         }
                         boolean isPrimitive = 
PRIMITIVES.contains(parameterTypeName);
                         if (isPrimitive && dimension > 0) {
diff --git a/java/javax/el/ExpressionFactory.java 
b/java/javax/el/ExpressionFactory.java
index de5187b1d7..f3da6936cc 100644
--- a/java/javax/el/ExpressionFactory.java
+++ b/java/javax/el/ExpressionFactory.java
@@ -354,8 +354,8 @@ public abstract class ExpressionFactory {
                 Properties props = new Properties();
                 props.load(is);
                 String value = props.getProperty(PROPERTY_NAME);
-                if (value != null && value.trim().length() > 0) {
-                    return value.trim();
+                if (value != null && 
JreCompat.getInstance().strip(value).length() > 0) {
+                    return JreCompat.getInstance().strip(value);
                 }
             } catch (FileNotFoundException e) {
                 // Should not happen - ignore it if it does
@@ -368,8 +368,8 @@ public abstract class ExpressionFactory {
 
     private static String getClassNameSysProp() {
         String value = System.getProperty(PROPERTY_NAME);
-        if (value != null && value.trim().length() > 0) {
-            return value.trim();
+        if (value != null && JreCompat.getInstance().strip(value).length() > 
0) {
+            return JreCompat.getInstance().strip(value);
         }
         return null;
     }
diff --git a/java/org/apache/catalina/authenticator/AuthenticatorBase.java 
b/java/org/apache/catalina/authenticator/AuthenticatorBase.java
index 3c14fec87a..5338f16661 100644
--- a/java/org/apache/catalina/authenticator/AuthenticatorBase.java
+++ b/java/org/apache/catalina/authenticator/AuthenticatorBase.java
@@ -65,6 +65,7 @@ import org.apache.catalina.valves.ValveBase;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.descriptor.web.FilterDef;
 import org.apache.tomcat.util.descriptor.web.FilterMap;
 import org.apache.tomcat.util.descriptor.web.LoginConfig;
@@ -261,7 +262,8 @@ public abstract class AuthenticatorBase extends ValveBase 
implements Authenticat
      */
     public void setSsoReauthenticationMode(String ssoReauthenticationMode) {
         this.ssoReauthenticationMode =
-                
SsoReauthenticationMode.valueOf(ssoReauthenticationMode.trim().toUpperCase(Locale.ENGLISH));
+                SsoReauthenticationMode
+                        
.valueOf(JreCompat.getInstance().strip(ssoReauthenticationMode).toUpperCase(Locale.ENGLISH));
     }
 
     /**
@@ -279,7 +281,8 @@ public abstract class AuthenticatorBase extends ValveBase 
implements Authenticat
      * @param allowCorsPreflight the CORS preflight handling mode
      */
     public void setAllowCorsPreflight(String allowCorsPreflight) {
-        this.allowCorsPreflight = 
AllowCorsPreflight.valueOf(allowCorsPreflight.trim().toUpperCase(Locale.ENGLISH));
+        this.allowCorsPreflight = AllowCorsPreflight
+                
.valueOf(JreCompat.getInstance().strip(allowCorsPreflight).toUpperCase(Locale.ENGLISH));
     }
 
     /**
diff --git a/java/org/apache/catalina/authenticator/SingleSignOn.java 
b/java/org/apache/catalina/authenticator/SingleSignOn.java
index 7dd0b6b14b..f16045cbed 100644
--- a/java/org/apache/catalina/authenticator/SingleSignOn.java
+++ b/java/org/apache/catalina/authenticator/SingleSignOn.java
@@ -37,6 +37,7 @@ import org.apache.catalina.SessionListener;
 import org.apache.catalina.connector.Request;
 import org.apache.catalina.connector.Response;
 import org.apache.catalina.valves.ValveBase;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -141,7 +142,7 @@ public class SingleSignOn extends ValveBase {
      * @param cookieDomain cookie domain name
      */
     public void setCookieDomain(String cookieDomain) {
-        if (cookieDomain != null && cookieDomain.trim().isEmpty()) {
+        if (cookieDomain != null && 
JreCompat.getInstance().strip(cookieDomain).isEmpty()) {
             this.cookieDomain = null;
         } else {
             this.cookieDomain = cookieDomain;
diff --git a/java/org/apache/catalina/core/StandardContext.java 
b/java/org/apache/catalina/core/StandardContext.java
index 6f7a3f8f2f..799ca2c8a4 100644
--- a/java/org/apache/catalina/core/StandardContext.java
+++ b/java/org/apache/catalina/core/StandardContext.java
@@ -1174,7 +1174,7 @@ public class StandardContext extends ContainerBase 
implements Context, Notificat
             return;
         }
         for (String servletName : resourceOnlyServlets.split(",")) {
-            servletName = servletName.trim();
+            servletName = JreCompat.getInstance().strip(servletName);
             if (!servletName.isEmpty()) {
                 this.resourceOnlyServlets.add(servletName);
             }
diff --git a/java/org/apache/catalina/core/StandardHost.java 
b/java/org/apache/catalina/core/StandardHost.java
index ca1dcfc903..4fe72d6761 100644
--- a/java/org/apache/catalina/core/StandardHost.java
+++ b/java/org/apache/catalina/core/StandardHost.java
@@ -46,6 +46,7 @@ import org.apache.catalina.valves.ErrorReportValve;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 
 /**
  * Standard implementation of the <b>Host</b> interface. Each child container 
must be a Context implementation to
@@ -235,7 +236,7 @@ public class StandardHost extends ContainerBase implements 
Host {
 
     @Override
     public void setAppBase(String appBase) {
-        if (appBase.trim().isEmpty()) {
+        if (JreCompat.getInstance().strip(appBase).isEmpty()) {
             log.warn(sm.getString("standardHost.problematicAppBase", 
getName()));
         }
         String oldAppBase = this.appBase;
diff --git a/java/org/apache/catalina/filters/CorsFilter.java 
b/java/org/apache/catalina/filters/CorsFilter.java
index 24eed3af67..bb425172fa 100644
--- a/java/org/apache/catalina/filters/CorsFilter.java
+++ b/java/org/apache/catalina/filters/CorsFilter.java
@@ -38,6 +38,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.catalina.Globals;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.http.Method;
 import org.apache.tomcat.util.http.RequestUtil;
 import org.apache.tomcat.util.http.ResponseUtil;
@@ -621,7 +622,7 @@ public class CorsFilter extends GenericFilter {
             final String allowedHttpHeaders, final String exposedHeaders, 
final String supportsCredentials,
             final String preflightMaxAge, final String decorateRequest) throws 
ServletException {
 
-        if (allowedOrigins.trim().equals("*")) {
+        if (JreCompat.getInstance().strip(allowedOrigins).equals("*")) {
             this.anyOriginAllowed = true;
         } else {
             this.anyOriginAllowed = false;
@@ -686,7 +687,7 @@ public class CorsFilter extends GenericFilter {
 
         Set<String> set = new HashSet<>();
         for (String split : splits) {
-            set.add(split.trim());
+            set.add(JreCompat.getInstance().strip(split));
         }
 
         return set;
diff --git a/java/org/apache/catalina/filters/CsrfPreventionFilter.java 
b/java/org/apache/catalina/filters/CsrfPreventionFilter.java
index 2d8dc5f268..a41a170d09 100644
--- a/java/org/apache/catalina/filters/CsrfPreventionFilter.java
+++ b/java/org/apache/catalina/filters/CsrfPreventionFilter.java
@@ -46,6 +46,7 @@ import javax.servlet.http.HttpSession;
 import org.apache.catalina.util.RequestUtil;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.http.Method;
 
 /**
@@ -117,7 +118,7 @@ public class CsrfPreventionFilter extends 
CsrfPreventionFilterBase {
     public void setEntryPoints(String entryPoints) {
         String[] values = entryPoints.split(",");
         for (String value : values) {
-            this.entryPoints.add(value.trim());
+            this.entryPoints.add(JreCompat.getInstance().strip(value));
         }
     }
 
@@ -188,7 +189,7 @@ public class CsrfPreventionFilter extends 
CsrfPreventionFilterBase {
      * @return A collection of predicates representing the URL patterns.
      */
     protected static Collection<Predicate<String>> 
createNoNoncePredicates(ServletContext context, String patterns) {
-        if (null == patterns || patterns.trim().isEmpty()) {
+        if (null == patterns || 
JreCompat.getInstance().strip(patterns).isEmpty()) {
             return null;
         }
 
@@ -200,7 +201,7 @@ public class CsrfPreventionFilter extends 
CsrfPreventionFilterBase {
 
         ArrayList<Predicate<String>> matchers = new ArrayList<>(values.length);
         for (String value : values) {
-            Predicate<String> p = createNoNoncePredicate(context, 
value.trim());
+            Predicate<String> p = createNoNoncePredicate(context, 
JreCompat.getInstance().strip(value));
 
             if (null != p) {
                 matchers.add(p);
@@ -221,7 +222,7 @@ public class CsrfPreventionFilter extends 
CsrfPreventionFilterBase {
      * @return A Predicate which can match the specified pattern, or 
<code>null</code> if the pattern is null or blank.
      */
     protected static Predicate<String> createNoNoncePredicate(ServletContext 
context, String pattern) {
-        if (null == pattern || pattern.trim().isEmpty()) {
+        if (null == pattern || 
JreCompat.getInstance().strip(pattern).isEmpty()) {
             return null;
         }
         if (pattern.startsWith("mime:")) {
diff --git a/java/org/apache/catalina/filters/ExpiresFilter.java 
b/java/org/apache/catalina/filters/ExpiresFilter.java
index 04f41e5985..9d7f738dc7 100644
--- a/java/org/apache/catalina/filters/ExpiresFilter.java
+++ b/java/org/apache/catalina/filters/ExpiresFilter.java
@@ -44,6 +44,7 @@ import javax.servlet.http.MappingMatch;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.StringUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.http.Method;
 
 /**
@@ -1495,7 +1496,8 @@ public class ExpiresFilter extends FilterBase {
             try {
                 if (name.startsWith(PARAMETER_EXPIRES_BY_TYPE)) {
                     String contentType =
-                            
name.substring(PARAMETER_EXPIRES_BY_TYPE.length()).trim().toLowerCase(Locale.ENGLISH);
+                            
JreCompat.getInstance().strip(name.substring(PARAMETER_EXPIRES_BY_TYPE.length()))
+                                    .toLowerCase(Locale.ENGLISH);
                     ExpiresConfiguration expiresConfiguration = 
parseExpiresConfiguration(value);
                     this.expiresConfigurationByContentType.put(contentType, 
expiresConfiguration);
                 } else if (name.equalsIgnoreCase(PARAMETER_EXPIRES_DEFAULT)) {
@@ -1627,7 +1629,7 @@ public class ExpiresFilter extends FilterBase {
      * @return the parsed expires
      */
     protected ExpiresConfiguration parseExpiresConfiguration(String inputLine) 
{
-        String line = inputLine.trim();
+        String line = JreCompat.getInstance().strip(inputLine);
 
         StringTokenizer tokenizer = new StringTokenizer(line, " ");
 
diff --git a/java/org/apache/catalina/filters/RateLimitFilter.java 
b/java/org/apache/catalina/filters/RateLimitFilter.java
index d24de66a23..3b97398a62 100644
--- a/java/org/apache/catalina/filters/RateLimitFilter.java
+++ b/java/org/apache/catalina/filters/RateLimitFilter.java
@@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.catalina.util.RateLimiter;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -264,7 +265,7 @@ public class RateLimitFilter extends FilterBase {
         rateLimiter.setFilterConfig(filterConfig);
 
         if (policyName != null) {
-            String trimmedName = policyName.trim();
+            String trimmedName = JreCompat.getInstance().strip(policyName);
             if (!trimmedName.isEmpty()) {
                 rateLimiter.setPolicyName(trimmedName);
             }
diff --git a/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java 
b/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java
index 4149f1c4e9..87818feb77 100644
--- a/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java
+++ b/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java
@@ -33,6 +33,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import org.apache.tomcat.util.compat.JreCompat;
+
 /**
  * Provides basic CSRF protection for REST APIs. The filter assumes that the 
clients have adapted the transfer of the
  * nonce through the 'X-CSRF-Token' header.
@@ -248,7 +250,8 @@ public class RestCsrfPreventionFilter extends 
CsrfPreventionFilterBase {
      */
     public void setPathsAcceptingParams(String pathsList) {
         if (Objects.nonNull(pathsList)) {
-            Arrays.asList(pathsList.split(pathsDelimiter)).forEach(e -> 
pathsAcceptingParams.add(e.trim()));
+            Arrays.asList(pathsList.split(pathsDelimiter))
+                    .forEach(e -> 
pathsAcceptingParams.add(JreCompat.getInstance().strip(e)));
         }
     }
 
diff --git a/java/org/apache/catalina/ha/backend/TcpSender.java 
b/java/org/apache/catalina/ha/backend/TcpSender.java
index 1597090e18..d809a664f3 100644
--- a/java/org/apache/catalina/ha/backend/TcpSender.java
+++ b/java/org/apache/catalina/ha/backend/TcpSender.java
@@ -28,6 +28,7 @@ import java.util.StringTokenizer;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -108,7 +109,7 @@ public class TcpSender implements Sender {
         proxies = new Proxy[tok.countTokens()];
         int i = 0;
         while (tok.hasMoreTokens()) {
-            String token = tok.nextToken().trim();
+            String token = JreCompat.getInstance().strip(tok.nextToken());
             int pos = token.indexOf(':');
             if (pos <= 0) {
                 throw new 
Exception(sm.getString("tcpSender.invalidProxyList"));
diff --git a/java/org/apache/catalina/manager/HTMLManagerServlet.java 
b/java/org/apache/catalina/manager/HTMLManagerServlet.java
index 952f876df3..712cf95979 100644
--- a/java/org/apache/catalina/manager/HTMLManagerServlet.java
+++ b/java/org/apache/catalina/manager/HTMLManagerServlet.java
@@ -49,6 +49,7 @@ import org.apache.catalina.util.ContextName;
 import org.apache.catalina.util.ServerInfo;
 import org.apache.catalina.util.SessionComparators;
 import org.apache.catalina.util.URLEncoder;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 import org.apache.tomcat.util.security.Escape;
 
@@ -951,7 +952,7 @@ public class HTMLManagerServlet extends ManagerServlet {
         List<Session> sessions = getSessionsForName(cn, smClient);
         String sortBy = req.getParameter("sort");
         String orderBy = null;
-        if (null != sortBy && !sortBy.trim().isEmpty()) {
+        if (null != sortBy && 
!JreCompat.getInstance().strip(sortBy).isEmpty()) {
             Comparator<Session> comparator = getComparator(sortBy);
             if (comparator != null) {
                 orderBy = req.getParameter("order");
diff --git a/java/org/apache/catalina/realm/DataSourceRealm.java 
b/java/org/apache/catalina/realm/DataSourceRealm.java
index 78c398e290..8165401c1d 100644
--- a/java/org/apache/catalina/realm/DataSourceRealm.java
+++ b/java/org/apache/catalina/realm/DataSourceRealm.java
@@ -31,6 +31,7 @@ import javax.sql.DataSource;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.Server;
 import org.apache.naming.ContextBindings;
+import org.apache.tomcat.util.compat.JreCompat;
 
 /**
  * Implementation of <b>Realm</b> that works with any JDBC JNDI DataSource. 
See the Realm How-To for more details on how
@@ -447,7 +448,7 @@ public class DataSourceRealm extends RealmBase {
                     dbCredentials = rs.getString(1);
                 }
 
-                return (dbCredentials != null) ? dbCredentials.trim() : null;
+                return (dbCredentials != null) ? 
JreCompat.getInstance().strip(dbCredentials) : null;
             }
         } catch (SQLException e) {
             
containerLog.error(sm.getString("dataSourceRealm.getPassword.exception", 
username), e);
@@ -551,7 +552,7 @@ public class DataSourceRealm extends RealmBase {
                 while (rs.next()) {
                     String role = rs.getString(1);
                     if (role != null) {
-                        list.add(role.trim());
+                        list.add(JreCompat.getInstance().strip(role));
                     }
                 }
                 return list;
diff --git a/java/org/apache/catalina/realm/JDBCRealm.java 
b/java/org/apache/catalina/realm/JDBCRealm.java
index ffb5a2bae8..1ec7696575 100644
--- a/java/org/apache/catalina/realm/JDBCRealm.java
+++ b/java/org/apache/catalina/realm/JDBCRealm.java
@@ -29,6 +29,7 @@ import java.util.Properties;
 
 import org.apache.catalina.LifecycleException;
 import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 
 
 /**
@@ -525,7 +526,7 @@ public class JDBCRealm extends RealmBase {
                     dbConnection.commit();
 
                     if (dbCredentials != null) {
-                        dbCredentials = dbCredentials.trim();
+                        dbCredentials = 
JreCompat.getInstance().strip(dbCredentials);
                     }
 
                     return dbCredentials;
@@ -639,7 +640,7 @@ public class JDBCRealm extends RealmBase {
                     while (rs.next()) {
                         String role = rs.getString(1);
                         if (null != role) {
-                            roleList.add(role.trim());
+                            roleList.add(JreCompat.getInstance().strip(role));
                         }
                     }
 
diff --git a/java/org/apache/catalina/realm/JNDIRealm.java 
b/java/org/apache/catalina/realm/JNDIRealm.java
index 0e8343941c..1941ae60da 100644
--- a/java/org/apache/catalina/realm/JNDIRealm.java
+++ b/java/org/apache/catalina/realm/JNDIRealm.java
@@ -66,6 +66,7 @@ import org.apache.catalina.LifecycleException;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.buf.StringUtils;
 import org.apache.tomcat.util.collections.SynchronizedStack;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.ietf.jgss.GSSContext;
 import org.ietf.jgss.GSSCredential;
 import org.ietf.jgss.GSSName;
@@ -1087,7 +1088,7 @@ public class JNDIRealm extends RealmBase {
         if (cipherSuites == null || cipherSuitesArray != null) {
             return cipherSuitesArray;
         }
-        this.cipherSuites = this.cipherSuites.trim();
+        this.cipherSuites = JreCompat.getInstance().strip(this.cipherSuites);
         if (this.cipherSuites.isEmpty()) {
             containerLog.warn(sm.getString("jndiRealm.emptyCipherSuites"));
             this.cipherSuitesArray = null;
@@ -1154,7 +1155,7 @@ public class JNDIRealm extends RealmBase {
      */
     public void setHostnameVerifierClassName(String verifierClassName) {
         if (verifierClassName != null) {
-            this.hostNameVerifierClassName = verifierClassName.trim();
+            this.hostNameVerifierClassName = 
JreCompat.getInstance().strip(verifierClassName);
         } else {
             this.hostNameVerifierClassName = null;
         }
@@ -2751,7 +2752,8 @@ public class JNDIRealm extends RealmBase {
             return sslSocketFactory;
         }
         final SSLSocketFactory result;
-        if (this.sslSocketFactoryClassName != null && 
!sslSocketFactoryClassName.trim().isEmpty()) {
+        if (this.sslSocketFactoryClassName != null &&
+                
!JreCompat.getInstance().strip(sslSocketFactoryClassName).isEmpty()) {
             result = 
createSSLSocketFactoryFromClassName(this.sslSocketFactoryClassName);
         } else {
             result = createSSLContextFactoryFromProtocol(sslProtocol);
diff --git a/java/org/apache/catalina/realm/MemoryRealm.java 
b/java/org/apache/catalina/realm/MemoryRealm.java
index b10fcb1c55..c83151d56f 100644
--- a/java/org/apache/catalina/realm/MemoryRealm.java
+++ b/java/org/apache/catalina/realm/MemoryRealm.java
@@ -27,6 +27,7 @@ import java.util.Map;
 import org.apache.catalina.LifecycleException;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.digester.Digester;
 import org.apache.tomcat.util.file.ConfigFileLoader;
 
@@ -156,14 +157,14 @@ public class MemoryRealm extends RealmBase {
 
         // Accumulate the list of roles for this user
         List<String> list = new ArrayList<>();
-        if (roles != null && roles.trim().length() > 0) {
+        if (roles != null && JreCompat.getInstance().strip(roles).length() > 
0) {
             roles += ",";
             while (true) {
                 int comma = roles.indexOf(',');
                 if (comma < 0) {
                     break;
                 }
-                String role = roles.substring(0, comma).trim();
+                String role = JreCompat.getInstance().strip(roles.substring(0, 
comma));
                 if (!role.isEmpty()) {
                     list.add(role);
                 }
diff --git a/java/org/apache/catalina/realm/RealmBase.java 
b/java/org/apache/catalina/realm/RealmBase.java
index 8a962dc896..304dab9ccc 100644
--- a/java/org/apache/catalina/realm/RealmBase.java
+++ b/java/org/apache/catalina/realm/RealmBase.java
@@ -57,6 +57,7 @@ import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.IntrospectionUtils;
 import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.HexUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.descriptor.web.SecurityCollection;
 import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
 import org.apache.tomcat.util.res.StringManager;
@@ -955,7 +956,7 @@ public abstract class RealmBase extends LifecycleMBeanBase 
implements Realm {
         }
         List<String> attrs = new ArrayList<>();
         for (String name : userAttributes.split(USER_ATTRIBUTES_DELIMITER)) {
-            name = name.trim();
+            name = JreCompat.getInstance().strip(name);
             if (name.isEmpty()) {
                 continue;
             }
@@ -1661,7 +1662,7 @@ public abstract class RealmBase extends 
LifecycleMBeanBase implements Realm {
     }
 
     private static X509UsernameRetriever createUsernameRetriever(String 
className) throws LifecycleException {
-        if (null == className || className.trim().isEmpty()) {
+        if (null == className || 
JreCompat.getInstance().strip(className).isEmpty()) {
             return new X509SubjectDnRetriever();
         }
 
diff --git a/java/org/apache/catalina/security/SecurityListener.java 
b/java/org/apache/catalina/security/SecurityListener.java
index c14405bad7..664982e3c7 100644
--- a/java/org/apache/catalina/security/SecurityListener.java
+++ b/java/org/apache/catalina/security/SecurityListener.java
@@ -32,6 +32,7 @@ import org.apache.catalina.util.ServerInfo;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.StringUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -101,7 +102,7 @@ public class SecurityListener implements LifecycleListener {
         } else {
             String[] userNames = userNameList.split(",");
             for (String userName : userNames) {
-                userName = userName.trim();
+                userName = JreCompat.getInstance().strip(userName);
                 if (!userName.isEmpty()) {
                     
checkedOsUsers.add(userName.toLowerCase(Locale.getDefault()));
                 }
diff --git a/java/org/apache/catalina/servlets/CGIServlet.java 
b/java/org/apache/catalina/servlets/CGIServlet.java
index c4196ba95e..eb506035cc 100644
--- a/java/org/apache/catalina/servlets/CGIServlet.java
+++ b/java/org/apache/catalina/servlets/CGIServlet.java
@@ -55,6 +55,7 @@ import org.apache.catalina.WebResourceRoot;
 import org.apache.catalina.util.IOTools;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.compat.JrePlatform;
 import org.apache.tomcat.util.http.Method;
 import org.apache.tomcat.util.res.StringManager;
@@ -356,13 +357,13 @@ public final class CGIServlet extends HttpServlet {
 
         if (getServletConfig().getInitParameter("cgiMethods") != null) {
             String paramValue = 
getServletConfig().getInitParameter("cgiMethods");
-            paramValue = paramValue.trim();
+            paramValue = JreCompat.getInstance().strip(paramValue);
             if ("*".equals(paramValue)) {
                 cgiMethodsAll = true;
             } else {
                 String[] methods = paramValue.split(",");
                 for (String method : methods) {
-                    String trimmedMethod = method.trim();
+                    String trimmedMethod = 
JreCompat.getInstance().strip(method);
                     cgiMethods.add(trimmedMethod);
                 }
             }
diff --git a/java/org/apache/catalina/servlets/DefaultServlet.java 
b/java/org/apache/catalina/servlets/DefaultServlet.java
index 77368a41fb..7356d36f95 100644
--- a/java/org/apache/catalina/servlets/DefaultServlet.java
+++ b/java/org/apache/catalina/servlets/DefaultServlet.java
@@ -83,6 +83,7 @@ import org.apache.catalina.util.ServerInfo;
 import org.apache.catalina.util.URLEncoder;
 import org.apache.catalina.webresources.CachedResource;
 import org.apache.tomcat.util.buf.B2CConverter;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.http.FastHttpDateFormat;
 import org.apache.tomcat.util.http.Method;
 import org.apache.tomcat.util.http.ResponseUtil;
@@ -3255,7 +3256,7 @@ public class DefaultServlet extends HttpServlet {
          * @return An Order specifying the column and ascending/descending to 
be applied to resources.
          */
         public Order getOrder(String order) {
-            if (null == order || order.trim().isEmpty()) {
+            if (null == order || 
JreCompat.getInstance().strip(order).isEmpty()) {
                 return Order.DEFAULT;
             }
 
@@ -3269,7 +3270,7 @@ public class DefaultServlet extends HttpServlet {
             boolean ascending = false;
 
             for (String option : options) {
-                option = option.trim();
+                option = JreCompat.getInstance().strip(option);
 
                 if (2 < option.length()) {
                     char opt = option.charAt(0);
diff --git a/java/org/apache/catalina/session/JDBCStore.java 
b/java/org/apache/catalina/session/JDBCStore.java
index 0d6561c7be..f26a9340b7 100644
--- a/java/org/apache/catalina/session/JDBCStore.java
+++ b/java/org/apache/catalina/session/JDBCStore.java
@@ -44,6 +44,7 @@ import org.apache.catalina.LifecycleException;
 import org.apache.catalina.Session;
 import org.apache.juli.logging.Log;
 import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 
 /**
  * Implementation of the {@link org.apache.catalina.Store Store} interface 
that stores serialized session objects in a
@@ -425,7 +426,7 @@ public class JDBCStore extends StoreBase {
      * @param dataSourceName The JNDI name of the DataSource-factory
      */
     public void setDataSourceName(String dataSourceName) {
-        if (dataSourceName == null || dataSourceName.trim().isEmpty()) {
+        if (dataSourceName == null || 
JreCompat.getInstance().strip(dataSourceName).isEmpty()) {
             manager.getContext().getLogger().warn(sm.getString(getStoreName() 
+ ".missingDataSourceName"));
             return;
         }
diff --git a/java/org/apache/catalina/ssi/ExpressionTokenizer.java 
b/java/org/apache/catalina/ssi/ExpressionTokenizer.java
index 981a85fe4b..d76594da04 100644
--- a/java/org/apache/catalina/ssi/ExpressionTokenizer.java
+++ b/java/org/apache/catalina/ssi/ExpressionTokenizer.java
@@ -16,6 +16,8 @@
  */
 package org.apache.catalina.ssi;
 
+import org.apache.tomcat.util.compat.JreCompat;
+
 
 /**
  * Parses an expression string to return the individual tokens. This is 
patterned similar to the StreamTokenizer in the
@@ -62,7 +64,7 @@ public class ExpressionTokenizer {
      * @param expr The expression
      */
     public ExpressionTokenizer(String expr) {
-        this.expr = expr.trim().toCharArray();
+        this.expr = JreCompat.getInstance().strip(expr).toCharArray();
         this.length = this.expr.length;
     }
 
diff --git a/java/org/apache/catalina/ssi/SSIProcessor.java 
b/java/org/apache/catalina/ssi/SSIProcessor.java
index 2c4d04e039..22d95fb836 100644
--- a/java/org/apache/catalina/ssi/SSIProcessor.java
+++ b/java/org/apache/catalina/ssi/SSIProcessor.java
@@ -25,6 +25,7 @@ import java.util.HashMap;
 import java.util.Locale;
 
 import org.apache.catalina.util.IOTools;
+import org.apache.tomcat.util.compat.JreCompat;
 
 /**
  * The entry point to SSI processing. This class does the actual parsing, 
delegating to the SSIMediator, SSICommand, and
@@ -252,7 +253,7 @@ public class SSIProcessor {
                     collectingName = false;
                 }
             } else if (endQuote == 0 && c == '=') {
-                retString[idx++] = nameBuf.toString().trim();
+                retString[idx++] = 
JreCompat.getInstance().strip(nameBuf.toString());
                 nameBuf.setLength(0);
                 collectingName = false;
             } else if (endQuote == 0) {
diff --git a/java/org/apache/catalina/startup/WebappServiceLoader.java 
b/java/org/apache/catalina/startup/WebappServiceLoader.java
index abb266de23..b80403c67b 100644
--- a/java/org/apache/catalina/startup/WebappServiceLoader.java
+++ b/java/org/apache/catalina/startup/WebappServiceLoader.java
@@ -37,6 +37,7 @@ import java.util.regex.Pattern;
 import javax.servlet.ServletContext;
 
 import org.apache.catalina.Context;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.scan.JarFactory;
 
 /**
@@ -213,7 +214,7 @@ public class WebappServiceLoader<T> {
                 if (i >= 0) {
                     line = line.substring(0, i);
                 }
-                line = line.trim();
+                line = JreCompat.getInstance().strip(line);
                 if (line.isEmpty()) {
                     continue;
                 }
diff --git a/java/org/apache/catalina/storeconfig/XMLFormatPreserver.java 
b/java/org/apache/catalina/storeconfig/XMLFormatPreserver.java
index efdc7cce7f..9a23d65d31 100644
--- a/java/org/apache/catalina/storeconfig/XMLFormatPreserver.java
+++ b/java/org/apache/catalina/storeconfig/XMLFormatPreserver.java
@@ -34,6 +34,7 @@ import javax.xml.parsers.SAXParserFactory;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 import org.apache.tomcat.util.security.Escape;
 import org.xml.sax.Attributes;
@@ -285,8 +286,9 @@ public final class XMLFormatPreserver {
         }
         String freshText = fresh.getText();
         String candidateText = candidate.getText();
-        if (freshText != null && !freshText.trim().isEmpty()
-                && Objects.equals(freshText.trim(), candidateText == null ? 
null : candidateText.trim())) {
+        if (freshText != null && 
!JreCompat.getInstance().strip(freshText).isEmpty()
+                && Objects.equals(JreCompat.getInstance().strip(freshText),
+                        candidateText == null ? null : 
JreCompat.getInstance().strip(candidateText))) {
             score += 50;
         }
         return score;
@@ -346,7 +348,7 @@ public final class XMLFormatPreserver {
         }
         boolean hasChildren = !fresh.children.isEmpty();
         String text = fresh.getText();
-        boolean hasText = text != null && !text.trim().isEmpty();
+        boolean hasText = text != null && 
!JreCompat.getInstance().strip(text).isEmpty();
         // Reproduce the attribute line wrapping of StoreAppender: the 
position starts at the indentation level and
         // the attributes are wrapped on a new line once the position exceeds 
60 characters
         int position = indent;
@@ -483,8 +485,10 @@ public final class XMLFormatPreserver {
         // Only the significant text is compared: whitespace between child 
elements is layout, not content
         String aText = a.getText();
         String bText = b.getText();
-        String aTrimmed = (aText == null || aText.trim().isEmpty()) ? null : 
aText.trim();
-        String bTrimmed = (bText == null || bText.trim().isEmpty()) ? null : 
bText.trim();
+        String aTrimmed = (aText == null || 
JreCompat.getInstance().strip(aText).isEmpty()) ? null :
+                JreCompat.getInstance().strip(aText);
+        String bTrimmed = (bText == null || 
JreCompat.getInstance().strip(bText).isEmpty()) ? null :
+                JreCompat.getInstance().strip(bText);
         if (!Objects.equals(aTrimmed, bTrimmed)) {
             return false;
         }
diff --git a/java/org/apache/catalina/users/DataSourceUserDatabase.java 
b/java/org/apache/catalina/users/DataSourceUserDatabase.java
index 9b3867b38f..109e2c7f53 100644
--- a/java/org/apache/catalina/users/DataSourceUserDatabase.java
+++ b/java/org/apache/catalina/users/DataSourceUserDatabase.java
@@ -35,6 +35,7 @@ import org.apache.catalina.User;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -943,7 +944,7 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
                     return null;
                 }
 
-                dbCredentials = (dbCredentials != null) ? dbCredentials.trim() 
: null;
+                dbCredentials = (dbCredentials != null) ? 
JreCompat.getInstance().strip(dbCredentials) : null;
             }
         } catch (SQLException e) {
             log.error(sm.getString("dataSourceUserDatabase.exception"), e);
diff --git a/java/org/apache/catalina/users/MemoryUserDatabase.java 
b/java/org/apache/catalina/users/MemoryUserDatabase.java
index 961b9fa740..7960fddc07 100644
--- a/java/org/apache/catalina/users/MemoryUserDatabase.java
+++ b/java/org/apache/catalina/users/MemoryUserDatabase.java
@@ -38,6 +38,7 @@ import org.apache.catalina.UserDatabase;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.CloseableURLConnection;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.digester.AbstractObjectCreationFactory;
 import org.apache.tomcat.util.digester.Digester;
 import org.apache.tomcat.util.file.ConfigFileLoader;
@@ -713,10 +714,10 @@ class MemoryGroupCreationFactory extends 
AbstractObjectCreationFactory {
                 String rolename;
                 int comma = roles.indexOf(',');
                 if (comma >= 0) {
-                    rolename = roles.substring(0, comma).trim();
+                    rolename = 
JreCompat.getInstance().strip(roles.substring(0, comma));
                     roles = roles.substring(comma + 1);
                 } else {
-                    rolename = roles.trim();
+                    rolename = JreCompat.getInstance().strip(roles);
                     roles = "";
                 }
                 if (!rolename.isEmpty()) {
@@ -802,10 +803,10 @@ class MemoryUserCreationFactory extends 
AbstractObjectCreationFactory {
                 String groupname;
                 int comma = groups.indexOf(',');
                 if (comma >= 0) {
-                    groupname = groups.substring(0, comma).trim();
+                    groupname = 
JreCompat.getInstance().strip(groups.substring(0, comma));
                     groups = groups.substring(comma + 1);
                 } else {
-                    groupname = groups.trim();
+                    groupname = JreCompat.getInstance().strip(groups);
                     groups = "";
                 }
                 if (!groupname.isEmpty()) {
@@ -822,10 +823,10 @@ class MemoryUserCreationFactory extends 
AbstractObjectCreationFactory {
                 String rolename;
                 int comma = roles.indexOf(',');
                 if (comma >= 0) {
-                    rolename = roles.substring(0, comma).trim();
+                    rolename = 
JreCompat.getInstance().strip(roles.substring(0, comma));
                     roles = roles.substring(comma + 1);
                 } else {
-                    rolename = roles.trim();
+                    rolename = JreCompat.getInstance().strip(roles);
                     roles = "";
                 }
                 if (!rolename.isEmpty()) {
diff --git a/java/org/apache/catalina/util/ManifestResource.java 
b/java/org/apache/catalina/util/ManifestResource.java
index 8b7276012f..4be48954a4 100644
--- a/java/org/apache/catalina/util/ManifestResource.java
+++ b/java/org/apache/catalina/util/ManifestResource.java
@@ -20,6 +20,8 @@ import java.util.ArrayList;
 import java.util.jar.Attributes;
 import java.util.jar.Manifest;
 
+import org.apache.tomcat.util.compat.JreCompat;
+
 /**
  * Representation of a Manifest file and its available extensions and required 
extensions.
  */
@@ -168,7 +170,7 @@ public class ManifestResource {
             if (space < 0) {
                 break;
             }
-            String name = names.substring(0, space).trim();
+            String name = JreCompat.getInstance().strip(names.substring(0, 
space));
             names = names.substring(space + 1);
 
             String value = attributes.getValue(name + "-Extension-Name");
diff --git a/java/org/apache/catalina/valves/ParameterLimitValve.java 
b/java/org/apache/catalina/valves/ParameterLimitValve.java
index 4fc1d5bafd..827a6dac60 100644
--- a/java/org/apache/catalina/valves/ParameterLimitValve.java
+++ b/java/org/apache/catalina/valves/ParameterLimitValve.java
@@ -36,6 +36,7 @@ import org.apache.catalina.connector.Request;
 import org.apache.catalina.connector.Response;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.UDecoder;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.file.ConfigFileLoader;
 import org.apache.tomcat.util.file.ConfigurationSource;
 
@@ -248,7 +249,7 @@ public class ParameterLimitValve extends ValveBase {
             String line;
             while ((line = reader.readLine()) != null) {
                 // Trim whitespace from the line
-                line = line.trim();
+                line = JreCompat.getInstance().strip(line);
                 if (line.isEmpty() || line.startsWith("#")) {
                     // Skip empty lines or comments
                     continue;
@@ -259,8 +260,8 @@ public class ParameterLimitValve extends ValveBase {
                     throw new 
IllegalArgumentException(sm.getString("parameterLimitValve.invalidLine", line));
                 }
 
-                String patternString = line.substring(0, 
lastEqualsIndex).trim();
-                String limitsString = line.substring(lastEqualsIndex + 
1).trim();
+                String patternString = 
JreCompat.getInstance().strip(line.substring(0, lastEqualsIndex));
+                String limitsString = 
JreCompat.getInstance().strip(line.substring(lastEqualsIndex + 1));
 
                 Pattern pattern = 
Pattern.compile(UDecoder.URLDecode(patternString, StandardCharsets.UTF_8));
                 String[] limits = limitsString.split(",");
diff --git 
a/java/org/apache/catalina/valves/rewrite/RandomizedTextRewriteMap.java 
b/java/org/apache/catalina/valves/rewrite/RandomizedTextRewriteMap.java
index d809a77f9a..f235974ff1 100644
--- a/java/org/apache/catalina/valves/rewrite/RandomizedTextRewriteMap.java
+++ b/java/org/apache/catalina/valves/rewrite/RandomizedTextRewriteMap.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Random;
 
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.file.ConfigFileLoader;
 import org.apache.tomcat.util.file.ConfigurationSource.Resource;
 import org.apache.tomcat.util.res.StringManager;
@@ -52,13 +53,13 @@ public class RandomizedTextRewriteMap implements RewriteMap 
{
         try (Resource txtResource = 
ConfigFileLoader.getSource().getResource(txtFilePath);
                 BufferedReader reader = new BufferedReader(new 
InputStreamReader(txtResource.getInputStream()))) {
             while ((line = reader.readLine()) != null) {
-                line = line.trim();
+                line = JreCompat.getInstance().strip(line);
                 if (line.startsWith("#") || line.isEmpty()) {
                     // Ignore comment line or empty lines
                     continue;
                 } else if (line.indexOf('#') > 0) {
                     // Ignore comment characters after '#'
-                    line = line.substring(0, line.indexOf('#')).trim();
+                    line = JreCompat.getInstance().strip(line.substring(0, 
line.indexOf('#')));
                 }
                 // Like mod_rewrite, any whitespace separates the key from the
                 // value. The value may itself contain whitespace.
diff --git a/java/org/apache/catalina/valves/rewrite/ResolverImpl.java 
b/java/org/apache/catalina/valves/rewrite/ResolverImpl.java
index 71f50c4baf..f846d25f18 100644
--- a/java/org/apache/catalina/valves/rewrite/ResolverImpl.java
+++ b/java/org/apache/catalina/valves/rewrite/ResolverImpl.java
@@ -34,6 +34,7 @@ import org.apache.catalina.WebResource;
 import org.apache.catalina.WebResourceRoot;
 import org.apache.catalina.connector.Request;
 import org.apache.juli.logging.Log;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.http.FastHttpDateFormat;
 import org.apache.tomcat.util.http.RequestUtil;
 import org.apache.tomcat.util.net.SSLSupport;
@@ -363,7 +364,7 @@ public class ResolverImpl extends Resolver {
                 break;
             }
 
-            String key = unescape(fullDN.substring(start, eqPos)).trim();
+            String key = 
JreCompat.getInstance().strip(unescape(fullDN.substring(start, eqPos)));
             int valStart = eqPos + 1;
 
             // Find the unescaped ',' that ends this RDN, or end of string
@@ -378,7 +379,7 @@ public class ResolverImpl extends Resolver {
                 }
             }
 
-            String value = unescape(fullDN.substring(valStart, 
commaPos)).trim();
+            String value = 
JreCompat.getInstance().strip(unescape(fullDN.substring(valStart, commaPos)));
             if (!key.isEmpty()) {
                 components.put(key, value);
             }
diff --git a/java/org/apache/coyote/CompressionConfig.java 
b/java/org/apache/coyote/CompressionConfig.java
index 24fa9b1b44..7b52c80cca 100644
--- a/java/org/apache/coyote/CompressionConfig.java
+++ b/java/org/apache/coyote/CompressionConfig.java
@@ -30,6 +30,7 @@ import java.util.regex.Pattern;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.MessageBytes;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.http.MimeHeaders;
 import org.apache.tomcat.util.http.ResponseUtil;
 import org.apache.tomcat.util.http.parser.AcceptEncoding;
@@ -85,7 +86,7 @@ public class CompressionConfig {
         if (encodings != null && !encodings.isEmpty()) {
             StringTokenizer tokens = new StringTokenizer(encodings, ",");
             while (tokens.hasMoreTokens()) {
-                String token = tokens.nextToken().trim();
+                String token = 
JreCompat.getInstance().strip(tokens.nextToken());
                 if (!token.isEmpty()) {
                     newEncodings.add(token);
                 }
@@ -105,7 +106,7 @@ public class CompressionConfig {
     public void setCompression(String compression) {
         // Trim the value so that surrounding whitespace in the configuration
         // does not silently disable compression
-        String value = compression == null ? "" : compression.trim();
+        String value = compression == null ? "" : 
JreCompat.getInstance().strip(compression);
         if (value.equals("on")) {
             this.compressionLevel = 1;
         } else if (value.equals("force")) {
@@ -232,7 +233,7 @@ public class CompressionConfig {
         List<String> values = new ArrayList<>();
         StringTokenizer tokens = new StringTokenizer(compressibleMimeType, 
",");
         while (tokens.hasMoreTokens()) {
-            String token = tokens.nextToken().trim();
+            String token = JreCompat.getInstance().strip(tokens.nextToken());
             if (!token.isEmpty()) {
                 values.add(token);
             }
diff --git a/java/org/apache/coyote/http2/Http2Protocol.java 
b/java/org/apache/coyote/http2/Http2Protocol.java
index 0b12f61d6a..8fbd7ff40e 100644
--- a/java/org/apache/coyote/http2/Http2Protocol.java
+++ b/java/org/apache/coyote/http2/Http2Protocol.java
@@ -45,6 +45,7 @@ import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.StringUtils;
 import org.apache.tomcat.util.collections.SynchronizedStack;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.modeler.Registry;
 import org.apache.tomcat.util.net.SocketWrapperBase;
 import org.apache.tomcat.util.res.StringManager;
@@ -423,7 +424,7 @@ public class Http2Protocol implements UpgradeProtocol {
         if (commaSeparatedHeaders != null) {
             String[] headers = commaSeparatedHeaders.split(",");
             for (String header : headers) {
-                String trimmedHeader = 
header.trim().toLowerCase(Locale.ENGLISH);
+                String trimmedHeader = 
JreCompat.getInstance().strip(header).toLowerCase(Locale.ENGLISH);
                 if (toRemove.contains(trimmedHeader)) {
                     toRemove.remove(trimmedHeader);
                 } else {
diff --git a/java/org/apache/jasper/compiler/ELParser.java 
b/java/org/apache/jasper/compiler/ELParser.java
index 1e7fb5656a..4f0fc062c0 100644
--- a/java/org/apache/jasper/compiler/ELParser.java
+++ b/java/org/apache/jasper/compiler/ELParser.java
@@ -16,6 +16,7 @@
  */
 package org.apache.jasper.compiler;
 
+import org.apache.el.util.JreCompat;
 import org.apache.jasper.JasperException;
 import org.apache.jasper.compiler.ELNode.ELText;
 import org.apache.jasper.compiler.ELNode.Function;
@@ -269,7 +270,7 @@ public class ELParser {
         int end = len;
 
         // Look to see if the value is quoted
-        String trimmed = input.trim();
+        String trimmed = JreCompat.getInstance().strip(input);
         int trimmedLen = trimmed.length();
         if (trimmedLen > 1) {
             // Might be quoted
diff --git a/java/org/apache/jasper/compiler/Generator.java 
b/java/org/apache/jasper/compiler/Generator.java
index 7578e28f4e..ecdd8f2d5c 100644
--- a/java/org/apache/jasper/compiler/Generator.java
+++ b/java/org/apache/jasper/compiler/Generator.java
@@ -589,7 +589,7 @@ class Generator {
         Set<String> packages = new LinkedHashSet<>();
         Set<String> classes = new LinkedHashSet<>();
         for (String importName : imports) {
-            String trimmed = importName.trim();
+            String trimmed = JreCompat.getInstance().strip(importName);
             if (trimmed.endsWith(".*")) {
                 packages.add(trimmed.substring(0, trimmed.length() - 2));
             } else {
@@ -2047,7 +2047,7 @@ class Generator {
                     String revisedText = matcher.replaceAll("\n");
                     // Leading and trailing whitespace can be trimmed so remove
                     // it here as the regex won't remove it.
-                    text = revisedText.trim();
+                    text = JreCompat.getInstance().strip(revisedText);
                 }
             }
 
diff --git a/java/org/apache/jasper/compiler/JavacErrorDetail.java 
b/java/org/apache/jasper/compiler/JavacErrorDetail.java
index 158425a4dc..90f5af84bb 100644
--- a/java/org/apache/jasper/compiler/JavacErrorDetail.java
+++ b/java/org/apache/jasper/compiler/JavacErrorDetail.java
@@ -24,6 +24,7 @@ import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.el.util.JreCompat;
 import org.apache.jasper.JspCompilationContext;
 import org.apache.tomcat.Jar;
 
@@ -113,7 +114,7 @@ public class JavacErrorDetail {
                     // faulty. Scan forward to match the java line...
                     if (jspLines[jspBeginLineNum - 1].lastIndexOf("<%") > 
jspLines[jspBeginLineNum - 1]
                             .lastIndexOf("%>")) {
-                        String javaLine = javaLines[javaLineNum - 1].trim();
+                        String javaLine = 
JreCompat.getInstance().strip(javaLines[javaLineNum - 1]);
 
                         for (int i = jspBeginLineNum - 1; i < jspLines.length; 
i++) {
                             if (jspLines[i].contains(javaLine)) {
diff --git a/java/org/apache/jasper/compiler/Node.java 
b/java/org/apache/jasper/compiler/Node.java
index 3043fed6d9..b3d0c41aed 100644
--- a/java/org/apache/jasper/compiler/Node.java
+++ b/java/org/apache/jasper/compiler/Node.java
@@ -35,6 +35,7 @@ import javax.servlet.jsp.tagext.TagVariableInfo;
 import javax.servlet.jsp.tagext.TryCatchFinally;
 import javax.servlet.jsp.tagext.VariableInfo;
 
+import org.apache.el.util.JreCompat;
 import org.apache.jasper.Constants;
 import org.apache.jasper.JasperException;
 import org.apache.jasper.compiler.tagplugin.TagPluginContext;
@@ -743,7 +744,7 @@ public abstract class Node implements TagConstants {
             if (importEntry.indexOf(';') > -1) {
                 throw new 
IllegalArgumentException(Localizer.getMessage("jsp.error.page.invalid.import"));
             }
-            return importEntry.trim();
+            return JreCompat.getInstance().strip(importEntry);
         }
     }
 
@@ -813,14 +814,14 @@ public abstract class Node implements TagConstants {
             int start = 0;
             int index;
             while ((index = value.indexOf(',', start)) != -1) {
-                imports.add(value.substring(start, index).trim());
+                
imports.add(JreCompat.getInstance().strip(value.substring(start, index)));
                 start = index + 1;
             }
             if (start == 0) {
                 // No comma found
-                imports.add(value.trim());
+                imports.add(JreCompat.getInstance().strip(value));
             } else {
-                imports.add(value.substring(start).trim());
+                
imports.add(JreCompat.getInstance().strip(value.substring(start)));
             }
         }
 
@@ -2715,9 +2716,9 @@ public abstract class Node implements TagConstants {
                 } else if (this.isDeferredMethodInput()) {
                     String m = this.tai.getMethodSignature();
                     if (m != null) {
-                        int rti = m.trim().indexOf(' ');
+                        int rti = JreCompat.getInstance().strip(m).indexOf(' 
');
                         if (rti > 0) {
-                            return m.substring(0, rti).trim();
+                            return 
JreCompat.getInstance().strip(m.substring(0, rti));
                         }
                     }
                 }
@@ -2735,13 +2736,13 @@ public abstract class Node implements TagConstants {
                 if (this.isDeferredMethodInput()) {
                     String m = this.tai.getMethodSignature();
                     if (m != null) {
-                        m = m.trim();
+                        m = JreCompat.getInstance().strip(m);
                         m = m.substring(m.indexOf('(') + 1);
                         m = m.substring(0, m.length() - 1);
-                        if (!m.trim().isEmpty()) {
+                        if (!JreCompat.getInstance().strip(m).isEmpty()) {
                             String[] p = m.split(",");
                             for (int i = 0; i < p.length; i++) {
-                                p[i] = p[i].trim();
+                                p[i] = JreCompat.getInstance().strip(p[i]);
                             }
                             return p;
                         }
diff --git a/java/org/apache/jasper/compiler/SmapUtil.java 
b/java/org/apache/jasper/compiler/SmapUtil.java
index ae38984dea..9901c6902d 100644
--- a/java/org/apache/jasper/compiler/SmapUtil.java
+++ b/java/org/apache/jasper/compiler/SmapUtil.java
@@ -31,6 +31,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.el.util.JreCompat;
 import org.apache.jasper.JasperException;
 import org.apache.jasper.JspCompilationContext;
 import org.apache.jasper.compiler.SmapStratum.LineInfo;
@@ -637,7 +638,7 @@ public class SmapUtil {
             // beginning of the text.
             while ((next = text.indexOf('\n', index)) > -1) {
                 if (beginning) {
-                    String line = text.substring(index, next).trim();
+                    String line = 
JreCompat.getInstance().strip(text.substring(index, next));
                     if (!slashStarSeen && line.startsWith("/*")) {
                         slashStarSeen = true;
                     }
diff --git a/java/org/apache/jasper/compiler/Validator.java 
b/java/org/apache/jasper/compiler/Validator.java
index b90cdcaa12..3548f6a67a 100644
--- a/java/org/apache/jasper/compiler/Validator.java
+++ b/java/org/apache/jasper/compiler/Validator.java
@@ -40,6 +40,7 @@ import javax.servlet.jsp.tagext.TagInfo;
 import javax.servlet.jsp.tagext.TagLibraryInfo;
 import javax.servlet.jsp.tagext.ValidationMessage;
 
+import org.apache.el.util.JreCompat;
 import org.apache.jasper.JasperException;
 import org.apache.jasper.compiler.ELNode.Text;
 import org.apache.jasper.el.ELContextImpl;
@@ -1043,10 +1044,10 @@ class Validator {
                                     // for the attribute
                                     String m = tldAttr.getMethodSignature();
                                     if (m != null) {
-                                        m = m.trim();
+                                        m = JreCompat.getInstance().strip(m);
                                         int rti = m.indexOf(' ');
                                         if (rti > 0) {
-                                            expectedType = m.substring(0, 
rti).trim();
+                                            expectedType = 
JreCompat.getInstance().strip(m.substring(0, rti));
                                         }
                                     } else {
                                         expectedType = "java.lang.Object";
@@ -1491,7 +1492,7 @@ class Validator {
                     }
                     lastArg = true;
                 }
-                String arg = signature.substring(start, p).trim();
+                String arg = 
JreCompat.getInstance().strip(signature.substring(start, p));
                 if (!arg.isEmpty()) {
                     params.add(arg);
                 }
diff --git a/java/org/apache/jasper/tagplugins/jstl/Util.java 
b/java/org/apache/jasper/tagplugins/jstl/Util.java
index 61969e8afa..93a1a77559 100644
--- a/java/org/apache/jasper/tagplugins/jstl/Util.java
+++ b/java/org/apache/jasper/tagplugins/jstl/Util.java
@@ -32,6 +32,7 @@ import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.JspTagException;
 import javax.servlet.jsp.PageContext;
 
+import org.apache.el.util.JreCompat;
 import org.apache.jasper.Constants;
 import org.apache.jasper.compiler.Localizer;
 
@@ -138,7 +139,7 @@ public class Util {
             return null;
         }
         index += 1; // positioned after the '='
-        input = input.substring(index).trim();
+        input = JreCompat.getInstance().strip(input.substring(index));
         if (input.isEmpty()) {
             // Empty or whitespace-only parameter value, e.g. a malformed
             // "Content-Type: text/html;charset=" header from a remote server.
@@ -162,7 +163,7 @@ public class Util {
                 end = input.length();
             }
         }
-        return input.substring(begin, end).trim();
+        return JreCompat.getInstance().strip(input.substring(begin, end));
     }
 
     /**
diff --git a/java/org/apache/tomcat/util/buf/EncodedSolidusHandling.java 
b/java/org/apache/tomcat/util/buf/EncodedSolidusHandling.java
index e9879c9139..d69f147d16 100644
--- a/java/org/apache/tomcat/util/buf/EncodedSolidusHandling.java
+++ b/java/org/apache/tomcat/util/buf/EncodedSolidusHandling.java
@@ -18,6 +18,7 @@ package org.apache.tomcat.util.buf;
 
 import java.util.Locale;
 
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -67,7 +68,7 @@ public enum EncodedSolidusHandling {
      * @throws IllegalStateException if the string does not match any known 
strategy
      */
     public static EncodedSolidusHandling fromString(String from) {
-        String trimmedLower = from.trim().toLowerCase(Locale.ENGLISH);
+        String trimmedLower = 
JreCompat.getInstance().strip(from).toLowerCase(Locale.ENGLISH);
 
         for (EncodedSolidusHandling value : values()) {
             if (value.getValue().equals(trimmedLower)) {
diff --git a/java/org/apache/tomcat/util/buf/StringUtils.java 
b/java/org/apache/tomcat/util/buf/StringUtils.java
index 698b21875d..8fdb4db95f 100644
--- a/java/org/apache/tomcat/util/buf/StringUtils.java
+++ b/java/org/apache/tomcat/util/buf/StringUtils.java
@@ -20,6 +20,8 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.function.Function;
 
+import org.apache.tomcat.util.compat.JreCompat;
+
 /**
  * Utility methods to build a separated list from a given set (not 
java.util.Set) of inputs and return that list as a
  * string or append it to an existing StringBuilder. If the given set is null 
or empty, an empty string will be
@@ -177,7 +179,7 @@ public final class StringUtils {
 
         String[] splits = s.split(",");
         for (int i = 0; i < splits.length; ++i) {
-            splits[i] = splits[i].trim();
+            splits[i] = JreCompat.getInstance().strip(splits[i]);
         }
 
         return splits;
diff --git a/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java 
b/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java
index a652d87ae6..5b83a865ee 100644
--- a/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java
+++ b/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java
@@ -22,6 +22,7 @@ import javax.servlet.jsp.tagext.TagAttributeInfo;
 import javax.servlet.jsp.tagext.TagVariableInfo;
 import javax.servlet.jsp.tagext.VariableInfo;
 
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.digester.Digester;
 import org.apache.tomcat.util.digester.Rule;
 import org.apache.tomcat.util.digester.RuleSet;
@@ -484,7 +485,7 @@ public class TldRuleSet implements RuleSet {
         @Override
         public void body(String namespace, String name, String text) throws 
Exception {
             if (null != text) {
-                text = text.trim();
+                text = JreCompat.getInstance().strip(text);
             }
             boolean value = "true".equalsIgnoreCase(text) || 
"yes".equalsIgnoreCase(text);
             setter.invoke(digester.peek(), Boolean.valueOf(value));
diff --git a/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java 
b/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java
index 2d12e98db0..6c6a51bd86 100644
--- a/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java
+++ b/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java
@@ -34,6 +34,7 @@ import javax.servlet.annotation.ServletSecurity;
 import javax.servlet.annotation.ServletSecurity.EmptyRoleSemantic;
 
 import org.apache.juli.logging.Log;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 
 
@@ -699,7 +700,8 @@ public class SecurityConstraint extends XmlEncodingBase 
implements Serializable
                     msg.append(' ');
                 }
                 if (denyUncoveredHttpMethods) {
-                    
log.info(sm.getString("securityConstraint.uncoveredHttpMethodFix", pattern, 
msg.toString().trim()));
+                    
log.info(sm.getString("securityConstraint.uncoveredHttpMethodFix", pattern,
+                            JreCompat.getInstance().strip(msg.toString())));
                     SecurityCollection collection = new SecurityCollection();
                     for (String method : methods) {
                         collection.addOmittedMethod(method);
@@ -711,7 +713,8 @@ public class SecurityConstraint extends XmlEncodingBase 
implements Serializable
                     constraint.addCollection(collection);
                     newConstraints.add(constraint);
                 } else {
-                    
log.error(sm.getString("securityConstraint.uncoveredHttpMethod", pattern, 
msg.toString().trim()));
+                    
log.error(sm.getString("securityConstraint.uncoveredHttpMethod", pattern,
+                            JreCompat.getInstance().strip(msg.toString())));
                 }
                 continue;
             }
@@ -746,7 +749,7 @@ public class SecurityConstraint extends XmlEncodingBase 
implements Serializable
             }
             if (denyUncoveredHttpMethods) {
                 
log.info(sm.getString("securityConstraint.uncoveredHttpOmittedMethodFix", 
pattern,
-                        msg.toString().trim()));
+                        JreCompat.getInstance().strip(msg.toString())));
                 SecurityCollection collection = new SecurityCollection();
                 for (String method : omittedMethods) {
                     collection.addMethod(method);
@@ -759,7 +762,8 @@ public class SecurityConstraint extends XmlEncodingBase 
implements Serializable
                 newConstraints.add(constraint);
             } else {
                 log.error(
-                        
sm.getString("securityConstraint.uncoveredHttpOmittedMethod", pattern, 
msg.toString().trim()));
+                        
sm.getString("securityConstraint.uncoveredHttpOmittedMethod", pattern,
+                                
JreCompat.getInstance().strip(msg.toString())));
             }
         }
     }
diff --git a/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java 
b/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java
index acbc283847..54c0907953 100644
--- a/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java
+++ b/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java
@@ -20,6 +20,7 @@ import java.lang.reflect.Method;
 import java.util.ArrayList;
 
 import org.apache.tomcat.util.IntrospectionUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.digester.CallMethodRule;
 import org.apache.tomcat.util.digester.CallParamRule;
 import org.apache.tomcat.util.digester.Digester;
@@ -1246,13 +1247,13 @@ final class MappedNameRule extends Rule {
     @Override
     public void body(String namespace, String name, String text) throws 
Exception {
         ResourceBase resourceBase = (ResourceBase) digester.peek();
-        resourceBase.setProperty("mappedName", text.trim());
+        resourceBase.setProperty("mappedName", 
JreCompat.getInstance().strip(text));
 
         StringBuilder code = digester.getGeneratedCode();
         if (code != null) {
             code.append(System.lineSeparator());
             code.append(digester.toVariableName(resourceBase));
-            code.append(".setProperty(\"mappedName\", 
\"").append(text.trim()).append("\");");
+            code.append(".setProperty(\"mappedName\", 
\"").append(JreCompat.getInstance().strip(text)).append("\");");
             code.append(System.lineSeparator());
         }
     }
diff --git a/java/org/apache/tomcat/util/digester/CallMethodRule.java 
b/java/org/apache/tomcat/util/digester/CallMethodRule.java
index 1f2cb4f37f..fa1e98462c 100644
--- a/java/org/apache/tomcat/util/digester/CallMethodRule.java
+++ b/java/org/apache/tomcat/util/digester/CallMethodRule.java
@@ -19,6 +19,7 @@ package org.apache.tomcat.util.digester;
 import java.util.Arrays;
 
 import org.apache.tomcat.util.IntrospectionUtils;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.xml.sax.Attributes;
 
 /**
@@ -227,7 +228,7 @@ public class CallMethodRule extends Rule {
     public void body(String namespace, String name, String bodyText) throws 
Exception {
 
         if (paramCount == 0) {
-            this.bodyText = bodyText.trim();
+            this.bodyText = JreCompat.getInstance().strip(bodyText);
         }
 
     }
diff --git a/java/org/apache/tomcat/util/digester/CallParamRule.java 
b/java/org/apache/tomcat/util/digester/CallParamRule.java
index 6492e91ff5..603c37fdf8 100644
--- a/java/org/apache/tomcat/util/digester/CallParamRule.java
+++ b/java/org/apache/tomcat/util/digester/CallParamRule.java
@@ -16,6 +16,7 @@
  */
 package org.apache.tomcat.util.digester;
 
+import org.apache.tomcat.util.compat.JreCompat;
 import org.xml.sax.Attributes;
 
 /**
@@ -160,7 +161,7 @@ public class CallParamRule extends Rule {
             if (bodyTextStack == null) {
                 bodyTextStack = new ArrayStack<>();
             }
-            bodyTextStack.push(bodyText.trim());
+            bodyTextStack.push(JreCompat.getInstance().strip(bodyText));
         }
 
     }
diff --git a/java/org/apache/tomcat/util/digester/Digester.java 
b/java/org/apache/tomcat/util/digester/Digester.java
index 8b90503133..38bbdd2568 100644
--- a/java/org/apache/tomcat/util/digester/Digester.java
+++ b/java/org/apache/tomcat/util/digester/Digester.java
@@ -45,6 +45,7 @@ import org.apache.tomcat.util.IntrospectionUtils;
 import org.apache.tomcat.util.IntrospectionUtils.PropertySource;
 import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.ToStringUtil;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 import org.xml.sax.Attributes;
 import org.xml.sax.EntityResolver;
@@ -102,7 +103,7 @@ public class Digester extends DefaultHandler2 {
         if (classNames != null) {
             StringTokenizer classNamesTokenizer = new 
StringTokenizer(classNames, ",");
             while (classNamesTokenizer.hasMoreTokens()) {
-                String className = classNamesTokenizer.nextToken().trim();
+                String className = 
JreCompat.getInstance().strip(classNamesTokenizer.nextToken());
                 ClassLoader[] cls = new ClassLoader[] { 
Digester.class.getClassLoader(),
                         Thread.currentThread().getContextClassLoader() };
                 for (ClassLoader cl : cls) {
diff --git a/java/org/apache/tomcat/util/http/CookiesWithoutEquals.java 
b/java/org/apache/tomcat/util/http/CookiesWithoutEquals.java
index 4026872353..b9b603e3a1 100644
--- a/java/org/apache/tomcat/util/http/CookiesWithoutEquals.java
+++ b/java/org/apache/tomcat/util/http/CookiesWithoutEquals.java
@@ -18,6 +18,7 @@ package org.apache.tomcat.util.http;
 
 import java.util.Locale;
 
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -105,7 +106,7 @@ public enum CookiesWithoutEquals {
      * @return The corresponding enum value
      */
     public static CookiesWithoutEquals fromString(String from) {
-        String trimmedLower = from.trim().toLowerCase(Locale.ENGLISH);
+        String trimmedLower = 
JreCompat.getInstance().strip(from).toLowerCase(Locale.ENGLISH);
 
         for (CookiesWithoutEquals value : values()) {
             if (value.getValue().equals(trimmedLower)) {
diff --git a/java/org/apache/tomcat/util/net/SSLHostConfig.java 
b/java/org/apache/tomcat/util/net/SSLHostConfig.java
index 9cc477dcee..a8c1371258 100644
--- a/java/org/apache/tomcat/util/net/SSLHostConfig.java
+++ b/java/org/apache/tomcat/util/net/SSLHostConfig.java
@@ -36,6 +36,7 @@ import javax.net.ssl.TrustManagerFactory;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.net.openssl.OpenSSLConf;
 import org.apache.tomcat.util.net.openssl.ciphers.Cipher;
 import org.apache.tomcat.util.net.openssl.ciphers.Group;
@@ -797,7 +798,7 @@ public class SSLHostConfig implements Serializable {
                 String[] components = ciphersList.split(":");
                 // Remove any TLS 1.3 cipher suites
                 for (String component : components) {
-                    String trimmed = component.trim();
+                    String trimmed = JreCompat.getInstance().strip(component);
                     if 
(OpenSSLCipherConfigurationParser.isTls13Cipher(trimmed)) {
                         
log.warn(sm.getString("sslHostConfig.handleTls13CiphersuiteInCiphers", 
trimmed));
                         if (sbCipherSuitesFromCiphers.length() > 0) {
@@ -820,7 +821,7 @@ public class SSLHostConfig implements Serializable {
                 StringBuilder sbCipherSuitesFromCiphers = new StringBuilder();
                 String[] ciphers = ciphersList.split(",");
                 for (String cipher : ciphers) {
-                    String trimmed = cipher.trim();
+                    String trimmed = JreCompat.getInstance().strip(cipher);
                     if (!trimmed.isEmpty()) {
                         if 
(OpenSSLCipherConfigurationParser.isTls13Cipher(trimmed)) {
                             
log.warn(sm.getString("sslHostConfig.handleTls13CiphersuiteInCiphers", 
trimmed));
@@ -921,7 +922,7 @@ public class SSLHostConfig implements Serializable {
             values = cipherSuites.split(",");
         }
         for (String value : values) {
-            String trimmed = value.trim();
+            String trimmed = JreCompat.getInstance().strip(value);
             if (!trimmed.isEmpty()) {
                 if (!OpenSSLCipherConfigurationParser.isTls13Cipher(trimmed)) {
                     
log.warn(sm.getString("sslHostConfig.ignoreNonTls13Ciphersuite", trimmed));
@@ -1121,11 +1122,11 @@ public class SSLHostConfig implements Serializable {
         // Split using a positive lookahead to keep the separator in
         // the capture so we can check which case it is.
         for (String value : input.split("(?=[-+,])")) {
-            String trimmed = value.trim();
+            String trimmed = JreCompat.getInstance().strip(value);
             // Ignore token which only consists of prefix character
             if (trimmed.length() > 1) {
                 if (trimmed.charAt(0) == '+') {
-                    trimmed = trimmed.substring(1).trim();
+                    trimmed = 
JreCompat.getInstance().strip(trimmed.substring(1));
                     if (trimmed.equalsIgnoreCase(Constants.SSL_PROTO_ALL)) {
                         protocols.addAll(SSL_PROTO_ALL_SET);
                     } else {
@@ -1133,7 +1134,7 @@ public class SSLHostConfig implements Serializable {
                         explicitlyRequestedProtocols.add(trimmed);
                     }
                 } else if (trimmed.charAt(0) == '-') {
-                    trimmed = trimmed.substring(1).trim();
+                    trimmed = 
JreCompat.getInstance().strip(trimmed.substring(1));
                     if (trimmed.equalsIgnoreCase(Constants.SSL_PROTO_ALL)) {
                         protocols.removeAll(SSL_PROTO_ALL_SET);
                     } else {
@@ -1142,7 +1143,7 @@ public class SSLHostConfig implements Serializable {
                     }
                 } else {
                     if (trimmed.charAt(0) == ',') {
-                        trimmed = trimmed.substring(1).trim();
+                        trimmed = 
JreCompat.getInstance().strip(trimmed.substring(1));
                     }
                     if (!protocols.isEmpty()) {
                         log.warn(sm.getString("sslHostConfig.prefix_missing", 
trimmed, getHostName()));
@@ -1247,7 +1248,7 @@ public class SSLHostConfig implements Serializable {
                 String[] groupNames = groups.split(",");
                 for (String groupName : groupNames) {
                     try {
-                        Group group = Group.valueOf(groupName.trim());
+                        Group group = 
Group.valueOf(JreCompat.getInstance().strip(groupName));
                         groupList.add(group);
                     } catch (IllegalArgumentException e) {
                         log.warn(sm.getString("sslHostConfig.unknownGroup", 
groupName));
diff --git a/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java 
b/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java
index 6744cca901..225aacf66b 100644
--- a/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java
+++ b/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java
@@ -25,6 +25,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.tomcat.JarScanFilter;
 import org.apache.tomcat.JarScanType;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.file.Matcher;
 
 /**
@@ -295,7 +296,7 @@ public class StandardJarScanFilter implements JarScanFilter 
{
         if (attribute != null) {
             StringTokenizer tokenizer = new StringTokenizer(attribute, ",");
             while (tokenizer.hasMoreElements()) {
-                String token = tokenizer.nextToken().trim();
+                String token = 
JreCompat.getInstance().strip(tokenizer.nextToken());
                 if (!token.isEmpty()) {
                     set.add(token);
                 }
diff --git a/java/org/apache/tomcat/util/scan/StandardJarScanner.java 
b/java/org/apache/tomcat/util/scan/StandardJarScanner.java
index abd2be785e..11cd4f5326 100644
--- a/java/org/apache/tomcat/util/scan/StandardJarScanner.java
+++ b/java/org/apache/tomcat/util/scan/StandardJarScanner.java
@@ -522,7 +522,7 @@ public class StandardJarScanner implements JarScanner {
             }
             String[] classPathEntries = classPathAttribute.split(" ");
             for (String classPathEntry : classPathEntries) {
-                classPathEntry = classPathEntry.trim();
+                classPathEntry = JreCompat.getInstance().strip(classPathEntry);
                 if (classPathEntry.isEmpty()) {
                     continue;
                 }
diff --git a/test/org/apache/catalina/tribes/demos/CoordinationDemo.java 
b/test/org/apache/catalina/tribes/demos/CoordinationDemo.java
index ad958a061f..54c97f3a8d 100644
--- a/test/org/apache/catalina/tribes/demos/CoordinationDemo.java
+++ b/test/org/apache/catalina/tribes/demos/CoordinationDemo.java
@@ -29,6 +29,7 @@ import 
org.apache.catalina.tribes.group.interceptors.NonBlockingCoordinator;
 import org.apache.catalina.tribes.group.interceptors.TcpFailureDetector;
 import org.apache.catalina.tribes.transport.ReceiverBase;
 import org.apache.catalina.tribes.util.Arrays;
+import org.apache.tomcat.util.compat.JreCompat;
 
 
 public class CoordinationDemo {
@@ -288,13 +289,13 @@ public class CoordinationDemo {
     public static String fill(String value, int length, String ch, boolean 
left) {
         StringBuilder buf = new StringBuilder();
         if (!left) {
-            buf.append(value.trim());
+            buf.append(JreCompat.getInstance().strip(value));
         }
-        for (int i = value.trim().length(); i < length; i++) {
+        for (int i = JreCompat.getInstance().strip(value).length(); i < 
length; i++) {
             buf.append(ch);
         }
         if (left) {
-            buf.append(value.trim());
+            buf.append(JreCompat.getInstance().strip(value));
         }
         return buf.toString();
     }
diff --git a/test/org/apache/catalina/valves/TestExtendedAccessLogValve.java 
b/test/org/apache/catalina/valves/TestExtendedAccessLogValve.java
index a883d2b4d2..e6203d3ed6 100644
--- a/test/org/apache/catalina/valves/TestExtendedAccessLogValve.java
+++ b/test/org/apache/catalina/valves/TestExtendedAccessLogValve.java
@@ -41,6 +41,7 @@ import org.apache.catalina.Host;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.http.Method;
 
 @RunWith(Parameterized.class)
@@ -165,7 +166,7 @@ public class TestExtendedAccessLogValve extends 
TomcatBaseTest {
         int result = 0;
         String[] lines = content.split("\\r?\\n");
         for (String line : lines) {
-            if (!line.startsWith("#") && !line.trim().isEmpty()) {
+            if (!line.startsWith("#") && 
!JreCompat.getInstance().strip(line).isEmpty()) {
                 result++;
             }
         }
@@ -179,7 +180,7 @@ public class TestExtendedAccessLogValve extends 
TomcatBaseTest {
         List<String> dataLines = new ArrayList<>();
         for (String line : lines) {
             if (!line.startsWith("#")) { // Skip directives
-                dataLines.add(line.trim());
+                dataLines.add(JreCompat.getInstance().strip(line));
             } else {
                 if (line.startsWith("#Fields: ")) {
                     Assert.assertEquals(line.substring("#Fields: ".length()), 
logPattern);
diff --git a/test/org/apache/catalina/webresources/TestFileResource.java 
b/test/org/apache/catalina/webresources/TestFileResource.java
index 315212a7ae..bc0df05b45 100644
--- a/test/org/apache/catalina/webresources/TestFileResource.java
+++ b/test/org/apache/catalina/webresources/TestFileResource.java
@@ -25,6 +25,7 @@ import org.junit.Test;
 
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.compat.JreCompat;
 
 public class TestFileResource extends TomcatBaseTest {
 
@@ -40,6 +41,7 @@ public class TestFileResource extends TomcatBaseTest {
 
         // Build the expected location the same way the webapp base dir is 
built
         File f = new File("test/webapp/WEB-INF/classes");
-        Assert.assertEquals(f.getCanonicalFile().toURI().toURL().toString(), 
out.toString().trim());
+        Assert.assertEquals(f.getCanonicalFile().toURI().toURL().toString(),
+                JreCompat.getInstance().strip(out.toString()));
     }
 }
diff --git a/test/org/apache/el/TesterFunctions.java 
b/test/org/apache/el/TesterFunctions.java
index ad962c1b15..5502b8d29c 100644
--- a/test/org/apache/el/TesterFunctions.java
+++ b/test/org/apache/el/TesterFunctions.java
@@ -20,9 +20,11 @@ import java.lang.reflect.Method;
 
 import javax.el.FunctionMapper;
 
+import org.apache.tomcat.util.compat.JreCompat;
+
 public class TesterFunctions {
     public static String trim(String input) {
-        return input.trim();
+        return JreCompat.getInstance().strip(input);
     }
 
     public static String concat(String... inputs) {
diff --git a/test/org/apache/jasper/compiler/TestEncodingDetector.java 
b/test/org/apache/jasper/compiler/TestEncodingDetector.java
index 6d4f07eef5..e3f234dd31 100644
--- a/test/org/apache/jasper/compiler/TestEncodingDetector.java
+++ b/test/org/apache/jasper/compiler/TestEncodingDetector.java
@@ -29,6 +29,7 @@ import org.junit.runners.Parameterized.Parameters;
 
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.compat.JreCompat;
 
 @RunWith(Parameterized.class)
 public class TestEncodingDetector extends TomcatBaseTest {
@@ -83,7 +84,7 @@ public class TestEncodingDetector extends TomcatBaseTest {
 
         if (expectedResponseCode == 200) {
             // trim() to remove whitespace like new lines
-            String bodyText = responseBody.toString().trim();
+            String bodyText = 
JreCompat.getInstance().strip(responseBody.toString());
             if (responseBodyOK.booleanValue()) {
                 Assert.assertEquals("OK", bodyText);
             } else {
diff --git a/test/org/apache/jasper/compiler/TestGenerator.java 
b/test/org/apache/jasper/compiler/TestGenerator.java
index f0754bca34..07accedf19 100644
--- a/test/org/apache/jasper/compiler/TestGenerator.java
+++ b/test/org/apache/jasper/compiler/TestGenerator.java
@@ -715,7 +715,7 @@ public class TestGenerator extends TomcatBaseTest {
                 throw new IllegalSelectorException();
             } else {
                 try {
-                    if (!state.trim().isEmpty()) {
+                    if (!JreCompat.getInstance().strip(state).isEmpty()) {
                         pageContext.getOut().print(state);
                         pageContext.getOut().print("-");
                     }
@@ -736,7 +736,7 @@ public class TestGenerator extends TomcatBaseTest {
                 throw new IllegalSelectorException();
             } else {
                 try {
-                    if (!state.trim().isEmpty()) {
+                    if (!JreCompat.getInstance().strip(state).isEmpty()) {
                         pageContext.getOut().print(state);
                         pageContext.getOut().print("-");
                     }
diff --git a/test/org/apache/jasper/compiler/TestJspUtil.java 
b/test/org/apache/jasper/compiler/TestJspUtil.java
index bab260d24c..6fe174c411 100644
--- a/test/org/apache/jasper/compiler/TestJspUtil.java
+++ b/test/org/apache/jasper/compiler/TestJspUtil.java
@@ -23,6 +23,7 @@ import org.junit.Test;
 
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.compat.JreCompat;
 
 public class TestJspUtil extends TomcatBaseTest {
 
@@ -37,7 +38,7 @@ public class TestJspUtil extends TomcatBaseTest {
         String[] lines = body.split("\n");
 
         for (String line : lines) {
-            line = line.trim();
+            line = JreCompat.getInstance().strip(line);
             if (line.startsWith("<p>")) {
                 line = line.substring(3, line.length() - 4);
                 String[] parts = line.split(":");
diff --git a/test/org/apache/juli/TestPerWebappJuliIntegration.java 
b/test/org/apache/juli/TestPerWebappJuliIntegration.java
index a32d1f8014..d0c5d30f4b 100644
--- a/test/org/apache/juli/TestPerWebappJuliIntegration.java
+++ b/test/org/apache/juli/TestPerWebappJuliIntegration.java
@@ -43,6 +43,7 @@ import org.apache.catalina.Context;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.compat.JreCompat;
 
 public class TestPerWebappJuliIntegration extends TomcatBaseTest {
     @Before
@@ -60,8 +61,8 @@ public class TestPerWebappJuliIntegration extends 
TomcatBaseTest {
         tomcat.start();
         ByteChunk res = getUrl("http://localhost:"; + getPort() + "/juli" + 
APP_ID_A + "/log_level");
         ByteChunk res2 = getUrl("http://localhost:"; + getPort() + "/juli" + 
APP_ID_B + "/log_level");
-        Assert.assertEquals(Level.FINE.toString(), res.toString().trim());
-        Assert.assertEquals(Level.INFO.toString(), res2.toString().trim());
+        Assert.assertEquals(Level.FINE.toString(), 
JreCompat.getInstance().strip(res.toString()));
+        Assert.assertEquals(Level.INFO.toString(), 
JreCompat.getInstance().strip(res2.toString()));
         tomcat.stop();
     }
     @Test
diff --git a/test/org/apache/naming/TestEnvEntry.java 
b/test/org/apache/naming/TestEnvEntry.java
index 7efd9c89da..b42a2369d5 100644
--- a/test/org/apache/naming/TestEnvEntry.java
+++ b/test/org/apache/naming/TestEnvEntry.java
@@ -27,6 +27,7 @@ import org.apache.catalina.Context;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.compat.JreCompat;
 
 public class TestEnvEntry extends TomcatBaseTest {
 
@@ -106,7 +107,7 @@ public class TestEnvEntry extends TomcatBaseTest {
         Assert.assertEquals(HttpServletResponse.SC_OK, rc);
 
         // JSP has leading and trailing white-space
-        String result = out.toString().trim();
+        String result = JreCompat.getInstance().strip(out.toString());
         Assert.assertEquals(expected, result);
     }
 
@@ -130,7 +131,7 @@ public class TestEnvEntry extends TomcatBaseTest {
         Assert.assertEquals(HttpServletResponse.SC_OK, rc);
 
         // JSP has leading and trailing white-space
-        String result = out.toString().trim();
+        String result = JreCompat.getInstance().strip(out.toString());
         Assert.assertEquals(expected, result);
     }
 }
diff --git a/test/org/apache/tomcat/util/net/openssl/ciphers/TesterOpenSSL.java 
b/test/org/apache/tomcat/util/net/openssl/ciphers/TesterOpenSSL.java
index 134ba8ee3e..9225176c20 100644
--- a/test/org/apache/tomcat/util/net/openssl/ciphers/TesterOpenSSL.java
+++ b/test/org/apache/tomcat/util/net/openssl/ciphers/TesterOpenSSL.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.catalina.util.IOTools;
+import org.apache.tomcat.util.compat.JreCompat;
 
 public class TesterOpenSSL {
 
@@ -250,7 +251,7 @@ public class TesterOpenSSL {
 
 
     public static Set<String> getOpenSSLCiphersAsSet(String specification) 
throws Exception {
-        String[] ciphers = getOpenSSLCiphersAsExpression(specification, 
true).trim().split(":");
+        String[] ciphers = 
JreCompat.getInstance().strip(getOpenSSLCiphersAsExpression(specification, 
true)).split(":");
         Set<String> result = new HashSet<>(Arrays.asList(ciphers));
         return result;
     }
@@ -390,7 +391,7 @@ public class TesterOpenSSL {
             System.err.println(errorText);
         }
 
-        return stdout.getText().trim();
+        return JreCompat.getInstance().strip(stdout.getText());
     }
 
     private static class InputStreamToText implements Runnable {
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index ca4dc20b2f..dc54ccb166 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -108,6 +108,14 @@
   issues do not "pop up" wrt. others).
 -->
 <section name="Tomcat 9.0.124 (remm)" rtext="in development">
+  <subsection name="General">
+    <changelog>
+      <scode>
+        Switch to using <code>String.strip()</code> rather than
+        <code>String.trim()</code> where appropriate. (markt)
+      </scode>
+    </changelog>
+  </subsection>
   <subsection name="Catalina">
     <changelog>
       <fix>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to