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

时间:2018-08-01 16:42:34

标签: java spring spring-mvc

我的控制器方法如下:

@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中为我处理的印象,但是现在我在猜测……

1 个答案:

答案 0 :(得分:0)

深入研究后,我在Spring JIRA上发现了this issue。我能够使用建议的解决方法来解决我的问题,而不必自己处理任何编码的URL。现在,重定向的工作方式如下:

Reader

虽然所描述的问题与我的情况不完全相同,但似乎2&3的答案是:

  1. Reader使用的编码方案与RedirectView中的URL编码器不同。
  2. 使用这种解决方法,它迫使Spring使用URIUtils对每个查询参数值进行编码。

我仍然不明白我的主要问题“是什么引起了这一变化?”的答案。但出于我的目的,发布的解决方法似乎可以解决问题。