Avoid triggering lazy resolution in MultipartResolver.cleanupMultipart

Issue: SPR-16640

(cherry picked from commit 10cb2cc)
This commit is contained in:
Juergen Hoeller
2018-03-27 00:25:05 +02:00
parent f2478cf8cf
commit c1cb0311aa
4 changed files with 37 additions and 15 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,6 +33,7 @@ import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.AbstractMultipartHttpServletRequest;
import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;
import org.springframework.web.util.WebUtils;
@@ -189,7 +190,8 @@ public class CommonsMultipartResolver extends CommonsFileUploadSupport
@Override
public void cleanupMultipart(MultipartHttpServletRequest request) {
if (request != null) {
if (!(request instanceof AbstractMultipartHttpServletRequest) ||
((AbstractMultipartHttpServletRequest) request).isResolved()) {
try {
cleanupFileItems(request.getMultiFileMap());
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2015 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -106,6 +106,18 @@ public abstract class AbstractMultipartHttpServletRequest extends HttpServletReq
return getMultipartFiles();
}
/**
* Determine whether the underlying multipart request has been resolved.
* @return {@code true} when eagerly initialized or lazily triggered,
* {@code false} in case of a lazy-resolution request that got aborted
* before any parameters or multipart files have been accessed
* @since 4.3.15
* @see #getMultipartFiles()
*/
public boolean isResolved() {
return (this.multipartFiles != null);
}
/**
* Set a Map with parameter names as keys and list of MultipartFile objects as values.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -48,6 +48,7 @@ import org.springframework.web.multipart.MultipartFile;
* @author Juergen Hoeller
* @author Rossen Stoyanchev
* @since 3.1
* @see StandardServletMultipartResolver
*/
public class StandardMultipartHttpServletRequest extends AbstractMultipartHttpServletRequest {
@@ -79,8 +80,11 @@ public class StandardMultipartHttpServletRequest extends AbstractMultipartHttpSe
* @param lazyParsing whether multipart parsing should be triggered lazily on
* first access of multipart files or parameters
* @throws MultipartException if an immediate parsing attempt failed
* @since 3.2.9
*/
public StandardMultipartHttpServletRequest(HttpServletRequest request, boolean lazyParsing) throws MultipartException {
public StandardMultipartHttpServletRequest(HttpServletRequest request, boolean lazyParsing)
throws MultipartException {
super(request);
if (!lazyParsing) {
parseRequest(request);

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -59,6 +59,7 @@ public class StandardServletMultipartResolver implements MultipartResolver {
* corresponding exceptions at the time of the {@link #resolveMultipart} call.
* Switch this to "true" for lazy multipart parsing, throwing parse exceptions
* once the application attempts to obtain multipart files or parameters.
* @since 3.2.9
*/
public void setResolveLazily(boolean resolveLazily) {
this.resolveLazily = resolveLazily;
@@ -82,17 +83,20 @@ public class StandardServletMultipartResolver implements MultipartResolver {
@Override
public void cleanupMultipart(MultipartHttpServletRequest request) {
// To be on the safe side: explicitly delete the parts,
// but only actual file parts (for Resin compatibility)
try {
for (Part part : request.getParts()) {
if (request.getFile(part.getName()) != null) {
part.delete();
if (!(request instanceof AbstractMultipartHttpServletRequest) ||
((AbstractMultipartHttpServletRequest) request).isResolved()) {
// To be on the safe side: explicitly delete the parts,
// but only actual file parts (for Resin compatibility)
try {
for (Part part : request.getParts()) {
if (request.getFile(part.getName()) != null) {
part.delete();
}
}
}
}
catch (Throwable ex) {
LogFactory.getLog(getClass()).warn("Failed to perform cleanup of multipart items", ex);
catch (Throwable ex) {
LogFactory.getLog(getClass()).warn("Failed to perform cleanup of multipart items", ex);
}
}
}