spring-projects/spring-framework — pull request #565 by eujungkim (2014-06-24 09:58:53+00:00)
Title: Fix request parameter comparison bug in isFlashMapForRequest() method of AbstractFlashMapManager.java.

The isFlashMapForRequest() method of AbstractFlashMapManager.java returns true when targetRequestParams of FlashMap and parameters in HttpServletRequest are same.

The value of targetRequestParams in FlashMap is encoded by RedirectView class using URLEncoder.encode(String, String)

and the value of parameters in HttpServletRequest is not encoded (or decoded already).

This is not a problem in normal case, but can make problem if special character as like white space is included in parameter.

example)
Controller's logic is follows :
redirectAttributes.addAttribute("ab", "a b");
redirectAttributes.addFlashAttribute("flashKey", "flashValue");

See the comparison logic of isFlashMapForRequest() method in AbstractFlashMapManager.java :

flashMap.getTargetRequestParams().get("ab") is "a+b"
request.getParameterValues("ab") is "a b".

So isFlashMapForRequest() method returns false.
And getMatchingFlashMap() method in in AbstractFlashMapManager.java returns null.
And retrieveAndUpdate() method in in AbstractFlashMapManager.java returns null, too.
And redirected Controller cannot get FlashMap.

So I change isFlashMapForRequest() method to decode the value of targetRequestParams in FlashMap
and add private decoding method.