Fix request parameter comparison bug in isFlashMapForRequest() method of AbstractFlashMapManager.java. #565
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.