Spring MVC 4.3中重定向后缺少flash属性



我的控制器方法如下所示:

@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

所以我真的有几个问题:

  1. Spring 4.0和4.3之间发生了什么变化,导致了这个问题
  2. 为什么URL编码会导致会话属性出现问题
  3. 在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个是:

  1. FlashMapManager依赖于与RedirectView中的URL编码器不同的编码方案
  2. 使用此解决方法,它强制Spring使用URIUtils对每个查询参数值进行编码

我仍然不明白"是什么变化导致了这种情况?"这个主要问题的答案,但就我而言,发布的变通方法似乎起到了作用。

最新更新