Skip to content

Conversation

eujungkim
Copy link
Contributor

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.

in AbstractFlashMapManager.java, 
and modify isFlashMapForRequest(FlashMap flashMap, HttpServletRequest
request) method in AbstractFlashMapManager.java 
to decode targetRequestParams in FlashMap.
FlashMapManagerTests.java for SPR-11821
@eujungkim
Copy link
Contributor Author

I have signed and agree to the terms of the SpringSource Individual Contributor License Agreement.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant