diff --git a/java/org/apache/catalina/core/ApplicationFilterChain.java b/java/org/apache/catalina/core/ApplicationFilterChain.java index de4144ad68c8..a36826ecfb45 100644 --- a/java/org/apache/catalina/core/ApplicationFilterChain.java +++ b/java/org/apache/catalina/core/ApplicationFilterChain.java @@ -17,6 +17,8 @@ package org.apache.catalina.core; import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; import java.util.Set; import jakarta.servlet.Filter; @@ -57,6 +59,8 @@ public final class ApplicationFilterChain implements FilterChain { */ private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0]; + private final Set addedFilters = new HashSet<>(); + /** * The int which is used to maintain the current position in the filter chain. @@ -113,7 +117,7 @@ public void doFilter(ServletRequest request, ServletResponse response) throws IO Filter filter = filterConfig.getFilter(); if (request.isAsyncSupported() && - "false".equalsIgnoreCase(filterConfig.getFilterDef().getAsyncSupported())) { + Boolean.FALSE.toString().equalsIgnoreCase(filterConfig.getFilterDef().getAsyncSupported())) { request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, Boolean.FALSE); } filter.doFilter(request, response, this); @@ -180,20 +184,17 @@ public static ServletResponse getLastServicedResponse() { * @param filterConfig The FilterConfig for the servlet to be executed */ void addFilter(ApplicationFilterConfig filterConfig) { - // Prevent the same filter being added multiple times - for (ApplicationFilterConfig filter : filters) { - if (filter == filterConfig) { - return; - } + if (addedFilters.contains(filterConfig)) { + return; } if (n == filters.length) { - ApplicationFilterConfig[] newFilters = new ApplicationFilterConfig[n + INCREMENT]; - System.arraycopy(filters, 0, newFilters, 0, n); - filters = newFilters; + int newSize = n + INCREMENT; + filters = Arrays.copyOf(filters, newSize); } filters[n++] = filterConfig; + addedFilters.add(filterConfig); } @@ -250,9 +251,9 @@ void setDispatcherWrapsSameObject(boolean dispatcherWrapsSameObject) { public void findNonAsyncFilters(Set result) { for (int i = 0; i < n; i++) { ApplicationFilterConfig filter = filters[i]; - if ("false".equalsIgnoreCase(filter.getFilterDef().getAsyncSupported())) { + if (Boolean.FALSE.toString().equalsIgnoreCase(filter.getFilterDef().getAsyncSupported())) { result.add(filter.getFilterClass()); } } } -} +} \ No newline at end of file