我的控制器方法如下所示:
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String handleSaveRequest(RedirectAttributes redirectAttributes,
Model model) {
redirectAttributes.addFlashAttribute("myFlashAttr", "FOOBAR");
return "redirect:/confirmationpage?myAttr=Some Value";
}
@RequestMapping(value = "/confirmationpage", method = RequestMethod.GET)
public String confirmationPage(@RequestParam String myAttr,
@ModelAttribute("myFlashAttr") String flashAttr,
Model model) {
logger.info("Param: " + myAttr);
logger.info("FlashAttr: " + flashAttr);
// Do Some stuff
return "path/to/confirmation.jsp";
}
我最初使用的是Spring 4.0,这是意料之中的事。当我被重定向到确认页面时,我有myAttr = "Some Value"
和flashAttr = "FOOBAR"
。然而,在升级到Spring 4.3之后,flashAttr
是空字符串(即myAttr = "Some Value"
和flashAttr = ""
(。
在黑暗中拍摄了一段时间后,我发现用"%20"
(即"redirect:/confirmationpage?myAttr=Some%20Value"
(替换重定向URL中的空白是可行的。进行此更改后,日志输出为预期的myAttr = Some Valu"
和flashAttr = FOOBAR
。
所以我真的有几个问题:
- Spring 4.0和4.3之间发生了什么变化,导致了这个问题
- 为什么URL编码会导致会话属性出现问题
- 在Spring MVC 4.3中,处理重定向URL编码的"正确"方法是什么?我一直觉得Spring在UrlBasedViewResolver中为我处理了这个问题,但现在我怀疑
经过深入研究,我在Spring JIRA上发现了这个问题。我能够使用建议的解决方法来解决我的问题,而不必自己处理任何URL编码。重定向现在的工作方式如下:
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String handleSaveRequest(RedirectAttributes redirectAttributes,
Model model) {
redirectAttributes.addFlashAttribute("myFlashAttr", "FOOBAR");
redirectAttributes.addAttribute("myAttr", "Some Value");
return "redirect:/confirmationpage?myAttr={myAttr}";
}
虽然所描述的问题并不完全符合我的情况,但似乎2&3个是:
FlashMapManager
依赖于与RedirectView中的URL编码器不同的编码方案- 使用此解决方法,它强制Spring使用URIUtils对每个查询参数值进行编码
我仍然不明白"是什么变化导致了这种情况?"这个主要问题的答案,但就我而言,发布的变通方法似乎起到了作用。