Servlet 3 multipart request implements getParameterMap defensively as well

Issue: SPR-11074
This commit is contained in:
Juergen Hoeller 2014-05-20 11:10:16 +02:00
parent 6fef8b996c
commit c7d1c49d6d
2 changed files with 49 additions and 19 deletions

View File

@ -18,7 +18,7 @@ package org.springframework.web.multipart.support;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
@ -75,22 +75,6 @@ public class DefaultMultipartHttpServletRequest extends AbstractMultipartHttpSer
}
@Override
public Enumeration<String> getParameterNames() {
Map<String, String[]> multipartParameters = getMultipartParameters();
if (multipartParameters.isEmpty()) {
return super.getParameterNames();
}
Set<String> paramNames = new LinkedHashSet<String>();
Enumeration<String> paramEnum = super.getParameterNames();
while (paramEnum.hasMoreElements()) {
paramNames.add(paramEnum.nextElement());
}
paramNames.addAll(multipartParameters.keySet());
return Collections.enumeration(paramNames);
}
@Override
public String getParameter(String name) {
String[] values = getMultipartParameters().get(name);
@ -109,11 +93,32 @@ public class DefaultMultipartHttpServletRequest extends AbstractMultipartHttpSer
return super.getParameterValues(name);
}
@Override
public Enumeration<String> getParameterNames() {
Map<String, String[]> multipartParameters = getMultipartParameters();
if (multipartParameters.isEmpty()) {
return super.getParameterNames();
}
Set<String> paramNames = new LinkedHashSet<String>();
Enumeration<String> paramEnum = super.getParameterNames();
while (paramEnum.hasMoreElements()) {
paramNames.add(paramEnum.nextElement());
}
paramNames.addAll(multipartParameters.keySet());
return Collections.enumeration(paramNames);
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> paramMap = new HashMap<String, String[]>();
Map<String, String[]> multipartParameters = getMultipartParameters();
if (multipartParameters.isEmpty()) {
return super.getParameterMap();
}
Map<String, String[]> paramMap = new LinkedHashMap<String, String[]>();
paramMap.putAll(super.getParameterMap());
paramMap.putAll(getMultipartParameters());
paramMap.putAll(multipartParameters);
return paramMap;
}

View File

@ -23,7 +23,9 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;
@ -138,6 +140,8 @@ public class StandardMultipartHttpServletRequest extends AbstractMultipartHttpSe
return super.getParameterNames();
}
// Servlet 3.0 getParameterNames() not guaranteed to include multipart form items
// (e.g. on WebLogic 12) -> need to merge them here to be on the safe side
Set<String> paramNames = new LinkedHashSet<String>();
Enumeration<String> paramEnum = super.getParameterNames();
while (paramEnum.hasMoreElements()) {
@ -147,6 +151,27 @@ public class StandardMultipartHttpServletRequest extends AbstractMultipartHttpSe
return Collections.enumeration(paramNames);
}
@Override
public Map<String, String[]> getParameterMap() {
if (this.multipartParameterNames == null) {
initializeMultipart();
}
if (this.multipartParameterNames.isEmpty()) {
return super.getParameterMap();
}
// Servlet 3.0 getParameterMap() not guaranteed to include multipart form items
// (e.g. on WebLogic 12) -> need to merge them here to be on the safe side
Map<String, String[]> paramMap = new LinkedHashMap<String, String[]>();
paramMap.putAll(super.getParameterMap());
for (String paramName : this.multipartParameterNames) {
if (!paramMap.containsKey(paramName)) {
paramMap.put(paramName, getParameterValues(paramName));
}
}
return paramMap;
}
@Override
public String getMultipartContentType(String paramOrFileName) {
try {