diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java index 8ebda0754b..23f7a3c9bd 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java @@ -79,6 +79,8 @@ public final class WebAsyncManager { private AsyncTaskExecutor taskExecutor = DEFAULT_TASK_EXECUTOR; + private boolean isMultipartRequestParsed; + @Nullable private volatile Object concurrentResult = RESULT_NONE; @@ -242,6 +244,24 @@ public final class WebAsyncManager { } } + /** + * Mark the {@link WebAsyncManager} as wrapping a + * multipart async request. + * @since 6.1.12 + */ + public void setMultipartRequestParsed(boolean isMultipart) { + this.isMultipartRequestParsed = isMultipart; + } + + /** + * Return {@code true} if this {@link WebAsyncManager} was previously marked + * as wrapping a multipart async request, {@code false} otherwise. + * @since 6.1.12 + */ + public boolean isMultipartRequestParsed() { + return this.isMultipartRequestParsed; + } + /** * Clear {@linkplain #getConcurrentResult() concurrentResult} and * {@linkplain #getConcurrentResultContext() concurrentResultContext}. diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java index c0922bfb3b..0c33b2b62b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java @@ -1117,10 +1117,11 @@ public class DispatcherServlet extends FrameworkServlet { if (mappedHandler != null) { mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response); } + asyncManager.setMultipartRequestParsed(multipartRequestParsed); } else { // Clean up any resources used by a multipart request. - if (multipartRequestParsed) { + if (multipartRequestParsed || asyncManager.isMultipartRequestParsed()) { cleanupMultipart(processedRequest); } }