You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2022/12/01 06:32:25 UTC

[struts] 01/01: WW-5262 Extracts excluded classes and beans into dedicated XML config files

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

lukaszlenart pushed a commit to branch WW-5262-beans
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 944c31f98f84d50ec90b818aaffe8e5616463355
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Thu Dec 1 07:32:16 2022 +0100

    WW-5262 Extracts excluded classes and beans into dedicated XML config files
---
 core/src/main/resources/struts-beans.xml           | 248 +++++++++++++++++
 core/src/main/resources/struts-default.xml         | 297 +--------------------
 .../src/main/resources/struts-excluded-classes.xml | 106 ++++++++
 3 files changed, 356 insertions(+), 295 deletions(-)

diff --git a/core/src/main/resources/struts-beans.xml b/core/src/main/resources/struts-beans.xml
new file mode 100644
index 000000000..eac1ff8be
--- /dev/null
+++ b/core/src/main/resources/struts-beans.xml
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+
+<!--
+    When declaring beans in this file you must either use name="struts" or don't name the bean at all.
+
+    The name="struts" must be used when alias was defined in {@link org.apache.struts2.config.StrutsBeanSelectionProvider} -
+    it is then the default bean's name and {@link org.apache.struts2.config.StrutsBeanSelectionProvider} links name "struts"
+    with "default" (aliasing it)
+
+    If name won't be defined then the "default" value will be used {@link com.opensymphony.xwork2.inject.Container#DEFAULT_NAME}
+    and {@link com.opensymphony.xwork2.inject.Inject}
+-->
+<!DOCTYPE struts PUBLIC
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
+
+<struts>
+
+    <bean class="com.opensymphony.xwork2.ObjectFactory" name="struts"/>
+    <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="struts"
+          class="org.apache.struts2.factory.StrutsResultFactory"/>
+    <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="struts"
+          class="com.opensymphony.xwork2.factory.DefaultActionFactory"/>
+    <bean type="com.opensymphony.xwork2.factory.ConverterFactory" name="struts"
+          class="com.opensymphony.xwork2.factory.StrutsConverterFactory"/>
+    <bean type="com.opensymphony.xwork2.factory.InterceptorFactory" name="struts"
+          class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory"/>
+    <bean type="com.opensymphony.xwork2.factory.ValidatorFactory" name="struts"
+          class="com.opensymphony.xwork2.factory.DefaultValidatorFactory"/>
+    <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory" name="struts"
+          class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory"/>
+
+    <bean type="com.opensymphony.xwork2.FileManager" class="com.opensymphony.xwork2.util.fs.DefaultFileManager"
+          name="system" scope="singleton"/>
+    <bean type="com.opensymphony.xwork2.FileManagerFactory"
+          class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" name="struts" scope="singleton"/>
+
+    <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="struts"
+          class="org.apache.struts2.factory.StrutsActionProxyFactory"/>
+    <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="prefix"
+          class="org.apache.struts2.factory.PrefixBasedActionProxyFactory"/>
+
+    <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="struts"
+          class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/>
+
+    <bean type="com.opensymphony.xwork2.util.PatternMatcher" name="struts"
+          class="com.opensymphony.xwork2.util.WildcardHelper"/>
+    <bean type="com.opensymphony.xwork2.util.PatternMatcher" name="namedVariable"
+          class="com.opensymphony.xwork2.util.NamedVariablePatternMatcher"/>
+    <bean type="com.opensymphony.xwork2.util.PatternMatcher" name="regex"
+          class="org.apache.struts2.util.RegexPatternMatcher"/>
+
+    <bean type="org.apache.struts2.util.ContentTypeMatcher" name="struts"
+          class="org.apache.struts2.util.DefaultContentTypeMatcher"/>
+
+    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="struts"
+          class="org.apache.struts2.dispatcher.mapper.DefaultActionMapper"/>
+    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="composite"
+          class="org.apache.struts2.dispatcher.mapper.CompositeActionMapper"/>
+    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="prefix"
+          class="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper"/>
+    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful"
+          class="org.apache.struts2.dispatcher.mapper.RestfulActionMapper"/>
+    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful2"
+          class="org.apache.struts2.dispatcher.mapper.Restful2ActionMapper"/>
+
+    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta"
+          class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="prototype"/>
+    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta-stream"
+          class="org.apache.struts2.dispatcher.multipart.JakartaStreamMultiPartRequest" scope="prototype"/>
+
+    <bean type="org.apache.struts2.views.TagLibraryModelProvider" name="s"
+          class="org.apache.struts2.views.DefaultTagLibrary"/>
+
+    <bean class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader"/>
+    <bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="struts"/>
+
+    <bean class="org.apache.struts2.components.template.TemplateEngineManager"/>
+    <bean type="org.apache.struts2.components.template.TemplateEngine" name="ftl"
+          class="org.apache.struts2.components.template.FreemarkerTemplateEngine"/>
+    <bean type="org.apache.struts2.components.template.TemplateEngine" name="jsp"
+          class="org.apache.struts2.components.template.JspTemplateEngine"/>
+
+    <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="struts"
+          class="com.opensymphony.xwork2.conversion.impl.XWorkConverter"/>
+
+    <bean type="com.opensymphony.xwork2.conversion.ConversionPropertiesProcessor" name="struts"
+          class="org.apache.struts2.conversion.StrutsConversionPropertiesProcessor"/>
+    <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor" name="struts"
+          class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor"/>
+    <bean type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor" name="struts"
+          class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor"/>
+    <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator" name="struts"
+          class="org.apache.struts2.conversion.StrutsTypeConverterCreator"/>
+    <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder" name="struts"
+          class="org.apache.struts2.conversion.StrutsTypeConverterHolder"/>
+
+    <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter"/>
+
+    <bean type="com.opensymphony.xwork2.conversion.impl.CollectionConverter" name="struts"
+          class="com.opensymphony.xwork2.conversion.impl.CollectionConverter" scope="singleton"/>
+    <bean type="com.opensymphony.xwork2.conversion.impl.ArrayConverter" name="struts"
+          class="com.opensymphony.xwork2.conversion.impl.ArrayConverter" scope="singleton"/>
+    <bean type="com.opensymphony.xwork2.conversion.impl.DateConverter" name="struts"
+          class="com.opensymphony.xwork2.conversion.impl.DateConverter" scope="singleton"/>
+    <bean type="com.opensymphony.xwork2.conversion.impl.NumberConverter" name="struts"
+          class="com.opensymphony.xwork2.conversion.impl.NumberConverter" scope="singleton"/>
+    <bean type="com.opensymphony.xwork2.conversion.impl.StringConverter" name="struts"
+          class="com.opensymphony.xwork2.conversion.impl.StringConverter" scope="singleton"/>
+
+    <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="global-only"
+          class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider" scope="singleton"/>
+    <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="struts"
+          class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider" scope="singleton"/>
+
+    <bean type="com.opensymphony.xwork2.TextProvider" name="system" class="com.opensymphony.xwork2.DefaultTextProvider"
+          scope="singleton"/>
+    <bean type="com.opensymphony.xwork2.TextProviderFactory" name="struts"
+          class="com.opensymphony.xwork2.StrutsTextProviderFactory" scope="singleton"/>
+    <bean type="com.opensymphony.xwork2.LocaleProviderFactory" name="struts"
+          class="com.opensymphony.xwork2.DefaultLocaleProviderFactory" scope="singleton"/>
+
+    <bean type="org.apache.struts2.components.UrlRenderer" name="struts"
+          class="org.apache.struts2.components.ServletUrlRenderer"/>
+    <bean type="org.apache.struts2.views.util.UrlHelper" name="struts"
+          class="org.apache.struts2.views.util.DefaultUrlHelper"/>
+
+    <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="struts"
+          class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory"/>
+    <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider" name="struts"
+          class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider"/>
+    <bean type="com.opensymphony.xwork2.util.reflection.ReflectionContextFactory" name="struts"
+          class="com.opensymphony.xwork2.ognl.OgnlReflectionContextFactory"/>
+
+    <bean type="com.opensymphony.xwork2.conversion.NullHandler" name="java.lang.Object"
+          class="com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler"/>
+
+    <bean type="com.opensymphony.xwork2.validator.ActionValidatorManager" name="struts"
+          class="com.opensymphony.xwork2.validator.AnnotationActionValidatorManager"/>
+    <bean type="com.opensymphony.xwork2.validator.ActionValidatorManager" name="no-annotations"
+          class="com.opensymphony.xwork2.validator.DefaultActionValidatorManager"/>
+
+    <bean type="com.opensymphony.xwork2.validator.ValidatorFactory"
+          class="com.opensymphony.xwork2.validator.DefaultValidatorFactory"/>
+    <bean type="com.opensymphony.xwork2.validator.ValidatorFileParser"
+          class="com.opensymphony.xwork2.validator.DefaultValidatorFileParser"/>
+
+    <bean class="com.opensymphony.xwork2.ognl.OgnlUtil"/>
+
+    <bean type="com.opensymphony.xwork2.util.TextParser" name="struts"
+          class="com.opensymphony.xwork2.util.OgnlTextParser" scope="singleton"/>
+
+    <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.util.CompoundRoot"
+          class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="java.lang.Object"
+          class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="java.util.Iterator"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="java.util.Enumeration"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="java.util.List"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="java.util.Set"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="java.util.Map"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="java.util.Collection"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.ognl.ObjectProxy"
+          class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.HttpParameters"
+          class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.Parameter"
+          class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor"/>
+
+    <bean type="ognl.MethodAccessor" name="java.lang.Object"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor"/>
+    <bean type="ognl.MethodAccessor" name="com.opensymphony.xwork2.util.CompoundRoot"
+          class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor"/>
+
+    <bean class="org.apache.struts2.views.jsp.ui.OgnlTool"/>
+
+    <bean type="org.apache.struts2.dispatcher.StaticContentLoader"
+          class="org.apache.struts2.dispatcher.DefaultStaticContentLoader" name="struts"/>
+    <bean type="com.opensymphony.xwork2.UnknownHandlerManager"
+          class="com.opensymphony.xwork2.DefaultUnknownHandlerManager" name="struts"/>
+
+    <bean type="org.apache.struts2.dispatcher.DispatcherErrorHandler" name="struts"
+          class="org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler"/>
+
+    <!--  Silly workarounds for OGNL since there is currently no way to flush its internal caches -->
+    <bean type="ognl.PropertyAccessor" name="java.util.ArrayList"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="java.util.HashSet"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor"/>
+    <bean type="ognl.PropertyAccessor" name="java.util.HashMap"
+          class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor"/>
+
+    <bean type="com.opensymphony.xwork2.security.ExcludedPatternsChecker" name="struts"
+          class="com.opensymphony.xwork2.security.DefaultExcludedPatternsChecker" scope="prototype"/>
+    <bean type="com.opensymphony.xwork2.security.AcceptedPatternsChecker" name="struts"
+          class="com.opensymphony.xwork2.security.DefaultAcceptedPatternsChecker" scope="prototype"/>
+    <bean type="com.opensymphony.xwork2.security.NotExcludedAcceptedPatternsChecker" name="struts"
+          class="com.opensymphony.xwork2.security.DefaultNotExcludedAcceptedPatternsChecker" scope="singleton"/>
+
+    <bean type="com.opensymphony.xwork2.config.providers.ValueSubstitutor"
+          class="com.opensymphony.xwork2.config.providers.EnvsValueSubstitutor" scope="singleton"/>
+
+    <bean type="org.apache.struts2.components.date.DateFormatter" name="simpleDateFormatter"
+          class="org.apache.struts2.components.date.SimpleDateFormatAdapter" scope="singleton"/>
+    <bean type="org.apache.struts2.components.date.DateFormatter" name="dateTimeFormatter"
+          class="org.apache.struts2.components.date.DateTimeFormatterAdapter" scope="singleton"/>
+
+    <bean type="com.opensymphony.xwork2.ognl.ExpressionCacheFactory" name="struts"
+          class="com.opensymphony.xwork2.ognl.DefaultOgnlExpressionCacheFactory" scope="singleton"/>
+    <bean type="com.opensymphony.xwork2.ognl.BeanInfoCacheFactory" name="struts"
+          class="com.opensymphony.xwork2.ognl.DefaultOgnlBeanInfoCacheFactory" scope="singleton"/>
+
+    <bean type="org.apache.struts2.url.QueryStringBuilder" name="strutsQueryStringBuilder"
+          class="org.apache.struts2.url.StrutsQueryStringBuilder" scope="singleton"/>
+    <bean type="org.apache.struts2.url.QueryStringParser" name="strutsQueryStringParser"
+          class="org.apache.struts2.url.StrutsQueryStringParser" scope="singleton"/>
+    <bean type="org.apache.struts2.url.UrlEncoder" name="strutsUrlEncoder"
+          class="org.apache.struts2.url.StrutsUrlEncoder" scope="singleton"/>
+    <bean type="org.apache.struts2.url.UrlDecoder" name="strutsUrlDecoder"
+          class="org.apache.struts2.url.StrutsUrlDecoder" scope="singleton"/>
+
+</struts>
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index 0bb197b56..420a2c56a 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -20,307 +20,14 @@
  */
 -->
 
-<!--
-    When declaring beans in this file you must either use name="struts" or don't name the bean at all.
-
-    The name="struts" must be used when alias was defined in {@link org.apache.struts2.config.StrutsBeanSelectionProvider} -
-    it is then the default bean's name and {@link org.apache.struts2.config.StrutsBeanSelectionProvider} links name "struts"
-    with "default" (aliasing it)
-
-    If name won't be defined then the "default" value will be used {@link com.opensymphony.xwork2.inject.Container#DEFAULT_NAME}
-    and {@link com.opensymphony.xwork2.inject.Inject}
--->
 <!DOCTYPE struts PUBLIC
         "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
         "https://struts.apache.org/dtds/struts-6.0.dtd">
 
 <struts>
 
-    <constant name="struts.excludedClasses"
-              value="
-                java.lang.Object,
-                java.lang.Runtime,
-                java.lang.System,
-                java.lang.Class,
-                java.lang.ClassLoader,
-                java.lang.Shutdown,
-                java.lang.ProcessBuilder,
-                java.lang.Thread,
-                sun.misc.Unsafe,
-                com.opensymphony.xwork2.ActionContext"/>
-
-    <constant name="struts.devMode.excludedClasses"
-              value="
-                java.lang.Object,
-                java.lang.Runtime,
-                java.lang.System,
-                java.lang.Class,
-                java.lang.ClassLoader,
-                java.lang.Shutdown,
-                java.lang.ProcessBuilder,
-                sun.misc.Unsafe"/>
-
-    <!-- this must be valid regex, each '.' in package name must be escaped! -->
-    <!-- it's more flexible but slower than simple string comparison -->
-    <!-- constant name="struts.excludedPackageNamePatterns" value="^java\.lang\..*,^ognl.*,^(?!javax\.servlet\..+)(javax\..+)" / -->
-    <!-- constant name="struts.devMode.excludedPackageNamePatterns" value="^java\.lang\..*,^ognl.*,^(?!javax\.servlet\..+)(javax\..+)" / -->
-
-    <!-- this is simpler version of the above used with string comparison -->
-    <constant name="struts.excludedPackageNames"
-              value="
-                ognl.,
-                java.io.,
-                java.net.,
-                java.nio.,
-                javax.,
-                freemarker.core.,
-                freemarker.template.,
-                freemarker.ext.jsp.,
-                freemarker.ext.rhino.,
-                sun.misc.,
-                sun.reflect.,
-                javassist.,
-                org.apache.velocity.,
-                org.objectweb.asm.,
-                org.springframework.context.,
-                com.opensymphony.xwork2.inject.,
-                com.opensymphony.xwork2.ognl.,
-                com.opensymphony.xwork2.security.,
-                com.opensymphony.xwork2.util.,
-                org.apache.tomcat.,
-                org.apache.catalina.core.,
-                org.wildfly.extension.undertow.deployment."/>
-
-    <constant name="struts.devMode.excludedPackageNames"
-              value="
-                ognl.,
-                java.io.,
-                java.net.,
-                java.nio.,
-                javax.,
-                freemarker.core.,
-                freemarker.template.,
-                freemarker.ext.jsp.,
-                freemarker.ext.rhino.,
-                sun.misc.,
-                sun.reflect.,
-                javassist.,
-                org.apache.velocity.,
-                org.objectweb.asm.,
-                org.springframework.context.,
-                com.opensymphony.xwork2.inject.,
-                com.opensymphony.xwork2.ognl.,
-                com.opensymphony.xwork2.security.,
-                com.opensymphony.xwork2.util."/>
-
-    <bean class="com.opensymphony.xwork2.ObjectFactory" name="struts"/>
-    <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="struts"
-          class="org.apache.struts2.factory.StrutsResultFactory"/>
-    <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="struts"
-          class="com.opensymphony.xwork2.factory.DefaultActionFactory"/>
-    <bean type="com.opensymphony.xwork2.factory.ConverterFactory" name="struts"
-          class="com.opensymphony.xwork2.factory.StrutsConverterFactory"/>
-    <bean type="com.opensymphony.xwork2.factory.InterceptorFactory" name="struts"
-          class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory"/>
-    <bean type="com.opensymphony.xwork2.factory.ValidatorFactory" name="struts"
-          class="com.opensymphony.xwork2.factory.DefaultValidatorFactory"/>
-    <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory" name="struts"
-          class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory"/>
-
-    <bean type="com.opensymphony.xwork2.FileManager" class="com.opensymphony.xwork2.util.fs.DefaultFileManager"
-          name="system" scope="singleton"/>
-    <bean type="com.opensymphony.xwork2.FileManagerFactory"
-          class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" name="struts" scope="singleton"/>
-
-    <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="struts"
-          class="org.apache.struts2.factory.StrutsActionProxyFactory"/>
-    <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="prefix"
-          class="org.apache.struts2.factory.PrefixBasedActionProxyFactory"/>
-
-    <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="struts"
-          class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/>
-
-    <bean type="com.opensymphony.xwork2.util.PatternMatcher" name="struts"
-          class="com.opensymphony.xwork2.util.WildcardHelper"/>
-    <bean type="com.opensymphony.xwork2.util.PatternMatcher" name="namedVariable"
-          class="com.opensymphony.xwork2.util.NamedVariablePatternMatcher"/>
-    <bean type="com.opensymphony.xwork2.util.PatternMatcher" name="regex"
-          class="org.apache.struts2.util.RegexPatternMatcher"/>
-
-    <bean type="org.apache.struts2.util.ContentTypeMatcher" name="struts"
-          class="org.apache.struts2.util.DefaultContentTypeMatcher"/>
-
-    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="struts"
-          class="org.apache.struts2.dispatcher.mapper.DefaultActionMapper"/>
-    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="composite"
-          class="org.apache.struts2.dispatcher.mapper.CompositeActionMapper"/>
-    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="prefix"
-          class="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper"/>
-    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful"
-          class="org.apache.struts2.dispatcher.mapper.RestfulActionMapper"/>
-    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful2"
-          class="org.apache.struts2.dispatcher.mapper.Restful2ActionMapper"/>
-
-    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta"
-          class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="prototype"/>
-    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta-stream"
-          class="org.apache.struts2.dispatcher.multipart.JakartaStreamMultiPartRequest" scope="prototype"/>
-
-    <bean type="org.apache.struts2.views.TagLibraryModelProvider" name="s"
-          class="org.apache.struts2.views.DefaultTagLibrary"/>
-
-    <bean class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader"/>
-    <bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="struts"/>
-
-    <bean class="org.apache.struts2.components.template.TemplateEngineManager"/>
-    <bean type="org.apache.struts2.components.template.TemplateEngine" name="ftl"
-          class="org.apache.struts2.components.template.FreemarkerTemplateEngine"/>
-    <bean type="org.apache.struts2.components.template.TemplateEngine" name="jsp"
-          class="org.apache.struts2.components.template.JspTemplateEngine"/>
-
-    <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="struts"
-          class="com.opensymphony.xwork2.conversion.impl.XWorkConverter"/>
-
-    <bean type="com.opensymphony.xwork2.conversion.ConversionPropertiesProcessor" name="struts"
-          class="org.apache.struts2.conversion.StrutsConversionPropertiesProcessor"/>
-    <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor" name="struts"
-          class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor"/>
-    <bean type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor" name="struts"
-          class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor"/>
-    <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator" name="struts"
-          class="org.apache.struts2.conversion.StrutsTypeConverterCreator"/>
-    <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder" name="struts"
-          class="org.apache.struts2.conversion.StrutsTypeConverterHolder"/>
-
-    <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter"/>
-
-    <bean type="com.opensymphony.xwork2.conversion.impl.CollectionConverter" name="struts"
-          class="com.opensymphony.xwork2.conversion.impl.CollectionConverter" scope="singleton"/>
-    <bean type="com.opensymphony.xwork2.conversion.impl.ArrayConverter" name="struts"
-          class="com.opensymphony.xwork2.conversion.impl.ArrayConverter" scope="singleton"/>
-    <bean type="com.opensymphony.xwork2.conversion.impl.DateConverter" name="struts"
-          class="com.opensymphony.xwork2.conversion.impl.DateConverter" scope="singleton"/>
-    <bean type="com.opensymphony.xwork2.conversion.impl.NumberConverter" name="struts"
-          class="com.opensymphony.xwork2.conversion.impl.NumberConverter" scope="singleton"/>
-    <bean type="com.opensymphony.xwork2.conversion.impl.StringConverter" name="struts"
-          class="com.opensymphony.xwork2.conversion.impl.StringConverter" scope="singleton"/>
-
-    <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="global-only"
-          class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider" scope="singleton"/>
-    <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="struts"
-          class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider" scope="singleton"/>
-
-    <bean type="com.opensymphony.xwork2.TextProvider" name="system" class="com.opensymphony.xwork2.DefaultTextProvider"
-          scope="singleton"/>
-    <bean type="com.opensymphony.xwork2.TextProviderFactory" name="struts"
-          class="com.opensymphony.xwork2.StrutsTextProviderFactory" scope="singleton"/>
-    <bean type="com.opensymphony.xwork2.LocaleProviderFactory" name="struts"
-          class="com.opensymphony.xwork2.DefaultLocaleProviderFactory" scope="singleton"/>
-
-    <bean type="org.apache.struts2.components.UrlRenderer" name="struts"
-          class="org.apache.struts2.components.ServletUrlRenderer"/>
-    <bean type="org.apache.struts2.views.util.UrlHelper" name="struts"
-          class="org.apache.struts2.views.util.DefaultUrlHelper"/>
-
-    <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="struts"
-          class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory"/>
-    <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider" name="struts"
-          class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider"/>
-    <bean type="com.opensymphony.xwork2.util.reflection.ReflectionContextFactory" name="struts"
-          class="com.opensymphony.xwork2.ognl.OgnlReflectionContextFactory"/>
-
-    <bean type="com.opensymphony.xwork2.conversion.NullHandler" name="java.lang.Object"
-          class="com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler"/>
-
-    <bean type="com.opensymphony.xwork2.validator.ActionValidatorManager" name="struts"
-          class="com.opensymphony.xwork2.validator.AnnotationActionValidatorManager"/>
-    <bean type="com.opensymphony.xwork2.validator.ActionValidatorManager" name="no-annotations"
-          class="com.opensymphony.xwork2.validator.DefaultActionValidatorManager"/>
-
-    <bean type="com.opensymphony.xwork2.validator.ValidatorFactory"
-          class="com.opensymphony.xwork2.validator.DefaultValidatorFactory"/>
-    <bean type="com.opensymphony.xwork2.validator.ValidatorFileParser"
-          class="com.opensymphony.xwork2.validator.DefaultValidatorFileParser"/>
-
-    <bean class="com.opensymphony.xwork2.ognl.OgnlUtil"/>
-
-    <bean type="com.opensymphony.xwork2.util.TextParser" name="struts"
-          class="com.opensymphony.xwork2.util.OgnlTextParser" scope="singleton"/>
-
-    <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.util.CompoundRoot"
-          class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="java.lang.Object"
-          class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="java.util.Iterator"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="java.util.Enumeration"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="java.util.List"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="java.util.Set"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="java.util.Map"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="java.util.Collection"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.ognl.ObjectProxy"
-          class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.HttpParameters"
-          class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.Parameter"
-          class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor"/>
-
-    <bean type="ognl.MethodAccessor" name="java.lang.Object"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor"/>
-    <bean type="ognl.MethodAccessor" name="com.opensymphony.xwork2.util.CompoundRoot"
-          class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor"/>
-
-    <bean class="org.apache.struts2.views.jsp.ui.OgnlTool"/>
-
-    <bean type="org.apache.struts2.dispatcher.StaticContentLoader"
-          class="org.apache.struts2.dispatcher.DefaultStaticContentLoader" name="struts"/>
-    <bean type="com.opensymphony.xwork2.UnknownHandlerManager"
-          class="com.opensymphony.xwork2.DefaultUnknownHandlerManager" name="struts"/>
-
-    <bean type="org.apache.struts2.dispatcher.DispatcherErrorHandler" name="struts"
-          class="org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler"/>
-
-    <!--  Silly workarounds for OGNL since there is currently no way to flush its internal caches -->
-    <bean type="ognl.PropertyAccessor" name="java.util.ArrayList"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="java.util.HashSet"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor"/>
-    <bean type="ognl.PropertyAccessor" name="java.util.HashMap"
-          class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor"/>
-
-    <bean type="com.opensymphony.xwork2.security.ExcludedPatternsChecker" name="struts"
-          class="com.opensymphony.xwork2.security.DefaultExcludedPatternsChecker" scope="prototype"/>
-    <bean type="com.opensymphony.xwork2.security.AcceptedPatternsChecker" name="struts"
-          class="com.opensymphony.xwork2.security.DefaultAcceptedPatternsChecker" scope="prototype"/>
-    <bean type="com.opensymphony.xwork2.security.NotExcludedAcceptedPatternsChecker" name="struts"
-          class="com.opensymphony.xwork2.security.DefaultNotExcludedAcceptedPatternsChecker" scope="singleton"/>
-
-    <bean type="com.opensymphony.xwork2.config.providers.ValueSubstitutor"
-          class="com.opensymphony.xwork2.config.providers.EnvsValueSubstitutor" scope="singleton"/>
-
-    <bean type="org.apache.struts2.components.date.DateFormatter" name="simpleDateFormatter"
-          class="org.apache.struts2.components.date.SimpleDateFormatAdapter" scope="singleton"/>
-    <bean type="org.apache.struts2.components.date.DateFormatter" name="dateTimeFormatter"
-          class="org.apache.struts2.components.date.DateTimeFormatterAdapter" scope="singleton"/>
-
-    <bean type="com.opensymphony.xwork2.ognl.ExpressionCacheFactory" name="struts"
-          class="com.opensymphony.xwork2.ognl.DefaultOgnlExpressionCacheFactory" scope="singleton"/>
-    <bean type="com.opensymphony.xwork2.ognl.BeanInfoCacheFactory" name="struts"
-          class="com.opensymphony.xwork2.ognl.DefaultOgnlBeanInfoCacheFactory" scope="singleton"/>
-
-    <bean type="org.apache.struts2.url.QueryStringBuilder" name="strutsQueryStringBuilder"
-          class="org.apache.struts2.url.StrutsQueryStringBuilder" scope="singleton"/>
-    <bean type="org.apache.struts2.url.QueryStringParser" name="strutsQueryStringParser"
-          class="org.apache.struts2.url.StrutsQueryStringParser" scope="singleton"/>
-    <bean type="org.apache.struts2.url.UrlEncoder" name="strutsUrlEncoder"
-          class="org.apache.struts2.url.StrutsUrlEncoder" scope="singleton"/>
-    <bean type="org.apache.struts2.url.UrlDecoder" name="strutsUrlDecoder"
-          class="org.apache.struts2.url.StrutsUrlDecoder" scope="singleton"/>
+    <include file="struts-excluded-classes.xml"/>
+    <include file="struts-beans.xml"/>
 
     <package name="struts-default" abstract="true">
         <result-types>
diff --git a/core/src/main/resources/struts-excluded-classes.xml b/core/src/main/resources/struts-excluded-classes.xml
new file mode 100644
index 000000000..524194af9
--- /dev/null
+++ b/core/src/main/resources/struts-excluded-classes.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-->
+
+<!DOCTYPE struts PUBLIC
+        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
+        "https://struts.apache.org/dtds/struts-6.0.dtd">
+
+<struts>
+
+    <constant name="struts.excludedClasses"
+              value="
+                java.lang.Object,
+                java.lang.Runtime,
+                java.lang.System,
+                java.lang.Class,
+                java.lang.ClassLoader,
+                java.lang.Shutdown,
+                java.lang.ProcessBuilder,
+                java.lang.Thread,
+                sun.misc.Unsafe,
+                com.opensymphony.xwork2.ActionContext"/>
+
+    <constant name="struts.devMode.excludedClasses"
+              value="
+                java.lang.Object,
+                java.lang.Runtime,
+                java.lang.System,
+                java.lang.Class,
+                java.lang.ClassLoader,
+                java.lang.Shutdown,
+                java.lang.ProcessBuilder,
+                sun.misc.Unsafe"/>
+
+    <!-- this must be valid regex, each '.' in package name must be escaped! -->
+    <!-- it's more flexible but slower than simple string comparison -->
+    <!-- constant name="struts.excludedPackageNamePatterns" value="^java\.lang\..*,^ognl.*,^(?!javax\.servlet\..+)(javax\..+)" / -->
+    <!-- constant name="struts.devMode.excludedPackageNamePatterns" value="^java\.lang\..*,^ognl.*,^(?!javax\.servlet\..+)(javax\..+)" / -->
+
+    <!-- this is simpler version of the above used with string comparison -->
+    <constant name="struts.excludedPackageNames"
+              value="
+                ognl.,
+                java.io.,
+                java.net.,
+                java.nio.,
+                javax.,
+                freemarker.core.,
+                freemarker.template.,
+                freemarker.ext.jsp.,
+                freemarker.ext.rhino.,
+                sun.misc.,
+                sun.reflect.,
+                javassist.,
+                org.apache.velocity.,
+                org.objectweb.asm.,
+                org.springframework.context.,
+                com.opensymphony.xwork2.inject.,
+                com.opensymphony.xwork2.ognl.,
+                com.opensymphony.xwork2.security.,
+                com.opensymphony.xwork2.util.,
+                org.apache.tomcat.,
+                org.apache.catalina.core.,
+                org.wildfly.extension.undertow.deployment."/>
+
+    <constant name="struts.devMode.excludedPackageNames"
+              value="
+                ognl.,
+                java.io.,
+                java.net.,
+                java.nio.,
+                javax.,
+                freemarker.core.,
+                freemarker.template.,
+                freemarker.ext.jsp.,
+                freemarker.ext.rhino.,
+                sun.misc.,
+                sun.reflect.,
+                javassist.,
+                org.apache.velocity.,
+                org.objectweb.asm.,
+                org.springframework.context.,
+                com.opensymphony.xwork2.inject.,
+                com.opensymphony.xwork2.ognl.,
+                com.opensymphony.xwork2.security.,
+                com.opensymphony.xwork2.util."/>
+
+</struts>