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 d4f0dfe3fa7b..1cfdeead2f5e 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 void registerDeferredResultInterceptors(DeferredResultProcessingIntercept } } + /** + * 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 d7542ae6a9fb..79699ad25bf7 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 @@ -1118,10 +1118,11 @@ protected void doDispatch(HttpServletRequest request, HttpServletResponse respon 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); } }