SPR-8789 Support request with multiple param values in FlahMap matching logic

This commit is contained in:
Rossen Stoyanchev
2011-11-01 16:26:25 +00:00
parent e6920a59fa
commit 8337f4bf20
3 changed files with 38 additions and 10 deletions

View File

@@ -28,6 +28,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.FlashMap;
import org.springframework.web.servlet.FlashMapManager;
@@ -123,10 +124,10 @@ public class DefaultFlashMapManager implements FlashMapManager {
return false;
}
}
MultiValueMap<String, String> params = flashMap.getTargetRequestParams();
for (String key : params.keySet()) {
for (String value : params.get(key)) {
if (!value.equals(request.getParameter(key))) {
MultiValueMap<String, String> targetParams = flashMap.getTargetRequestParams();
for (String paramName : targetParams.keySet()) {
for (String targetValue : targetParams.get(paramName)) {
if (!ObjectUtils.containsElement(request.getParameterValues(paramName), targetValue)) {
return false;
}
}

View File

@@ -133,22 +133,48 @@ public class DefaultFlashMapManagerTests {
this.flashMapManager.requestStarted(this.request);
assertNull(RequestContextUtils.getInputFlashMap(this.request));
assertEquals("FlashMap should have been removed", 1, getFlashMaps().size());
assertEquals("FlashMap should not have been removed", 1, getFlashMaps().size());
clearRequestAttributes();
clearFlashMapRequestAttributes();
this.request.setParameter("number", "two");
this.flashMapManager.requestStarted(this.request);
assertNull(RequestContextUtils.getInputFlashMap(this.request));
assertEquals("FlashMap should have been removed", 1, getFlashMaps().size());
assertEquals("FlashMap should not have been removed", 1, getFlashMaps().size());
clearRequestAttributes();
clearFlashMapRequestAttributes();
this.request.setParameter("number", "one");
this.flashMapManager.requestStarted(this.request);
assertEquals(flashMap, RequestContextUtils.getInputFlashMap(this.request));
assertEquals("Input FlashMap should have been removed", 0, getFlashMaps().size());
}
// SPR-8798
@Test
public void lookupFlashMapWithMultiValueParam() {
FlashMap flashMap = new FlashMap();
flashMap.put("name", "value");
flashMap.addTargetRequestParam("id", "1");
flashMap.addTargetRequestParam("id", "2");
List<FlashMap> allMaps = createFlashMaps();
allMaps.add(flashMap);
this.request.setParameter("id", "1");
this.flashMapManager.requestStarted(this.request);
assertNull(RequestContextUtils.getInputFlashMap(this.request));
assertEquals("FlashMap should not have been removed", 1, getFlashMaps().size());
clearFlashMapRequestAttributes();
this.request.addParameter("id", "2");
this.flashMapManager.requestStarted(this.request);
assertEquals(flashMap, RequestContextUtils.getInputFlashMap(this.request));
assertEquals("Input FlashMap should have been removed", 0, getFlashMaps().size());
}
@Test
public void lookupFlashMapSortOrder() {
@@ -284,7 +310,7 @@ public class DefaultFlashMapManagerTests {
return allMaps;
}
private void clearRequestAttributes() {
private void clearFlashMapRequestAttributes() {
request.removeAttribute(INPUT_FLASH_MAP_ATTRIBUTE);
request.removeAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE);
}