diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractFlashMapManager.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractFlashMapManager.java index 06a04df339d..0cc4d99ef87 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractFlashMapManager.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractFlashMapManager.java @@ -33,7 +33,6 @@ import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.web.servlet.FlashMap; import org.springframework.web.servlet.FlashMapManager; -import org.springframework.web.util.UriComponents; import org.springframework.web.util.UrlPathHelper; @@ -167,15 +166,13 @@ public abstract class AbstractFlashMapManager implements FlashMapManager { */ protected boolean isFlashMapForRequest(FlashMap flashMap, HttpServletRequest request) { String expectedPath = flashMap.getTargetRequestPath(); - String requestUri = getUrlPathHelper().getOriginatingRequestUri(request); if (expectedPath != null) { + String requestUri = getUrlPathHelper().getOriginatingRequestUri(request); if (!requestUri.equals(expectedPath) && !requestUri.equals(expectedPath + "/")) { return false; } } - String queryString = getUrlPathHelper().getOriginatingQueryString(request); - UriComponents uriComponents = ServletUriComponentsBuilder.fromUriString(requestUri).query(queryString).build(); - MultiValueMap actualParams = uriComponents.getQueryParams(); + MultiValueMap actualParams = getOriginatingRequestParams(request); MultiValueMap expectedParams = flashMap.getTargetRequestParams(); for (String expectedName : expectedParams.keySet()) { List actualValues = actualParams.get(expectedName); @@ -191,6 +188,11 @@ public abstract class AbstractFlashMapManager implements FlashMapManager { return true; } + private MultiValueMap getOriginatingRequestParams(HttpServletRequest request) { + String query = getUrlPathHelper().getOriginatingQueryString(request); + return ServletUriComponentsBuilder.fromPath("/").query(query).build().getQueryParams(); + } + @Override public final void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response) { if (CollectionUtils.isEmpty(flashMap)) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/FlashMapManagerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/FlashMapManagerTests.java index 829975b0c3f..07906ab4f5f 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/FlashMapManagerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/FlashMapManagerTests.java @@ -21,6 +21,7 @@ import static org.junit.Assert.*; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -318,16 +319,14 @@ public class FlashMapManagerTests { assertEquals("value", flashMap.get("key")); } - // SPR-15505 - - @Test + @Test // SPR-15505 public void retrieveAndUpdateMatchByOriginatingPathAndQueryString() { FlashMap flashMap = new FlashMap(); flashMap.put("key", "value"); flashMap.setTargetRequestPath("/accounts"); flashMap.addTargetRequestParam("a", "b"); - this.flashMapManager.setFlashMaps(Arrays.asList(flashMap)); + this.flashMapManager.setFlashMaps(Collections.singletonList(flashMap)); this.request.setAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE, "/accounts"); this.request.setAttribute(WebUtils.FORWARD_QUERY_STRING_ATTRIBUTE, "a=b"); @@ -339,6 +338,7 @@ public class FlashMapManagerTests { assertEquals("Input FlashMap should have been removed", 0, this.flashMapManager.getFlashMaps().size()); } + private static class TestFlashMapManager extends AbstractFlashMapManager { private List flashMaps;