为什么在GET重定向上清除SessionAttributes?

为简单起见,这些代码片段将缩短。 这样做的目的是获取GET参数,在会话上设置它,并在删除url参数的情况下重定向回GET。 基本上,URI清理。 如果有更好/更简单的方法来做到这一点,我会很高兴听到它。

我有一个控制器定义如下:

@Controller @RequestMapping("/path/page.xhtml") @Scope(BeanDefinition.SCOPE_PROTOTYPE) @SessionAttributes({ "myParam1", "myParam2" }) public class MyController { @RequestMapping(method = RequestMethod.GET, params = { "urlParam2" }) public String handleUriParam(@RequestParam(value = "urlParam2", required = false) final Long urlParam2, final RedirectAttributes redirs) { // at this point, myParam1 is set on the session. // now set the param as a flash attrib with the name of the session variable redirs.addFlashAttribute("myParam2", urlParam2); return "redirect:/path/page.xhtml"; } @RequestMapping(method = RequestMethod.GET, params = {}) public String doGetStuff(ModelMap model) { // do stuff using myParam1 and myParam2. // problem is, myParam2 is on the session, but myParam1 is not! } } 

就像代码所说的那样,当重定向发生时,某种方式myParam1正在被取消。 我可以通过将ModelMap传递给handleUrlParam方法并手动将myParam1添加到flash属性来解决这个问题,但这似乎打败了我的想法。

为什么重定向后会删除SessionAttribute myParam1

有没有更好的方法从URI中提取参数并将它们放在会话中?

UPDATE

因此,无论何时使用RedirectAttributes ,您都必须确保将要包含的任何SessionAttribute放入FlashAttributes的重定向中,否则它们将丢失。 我想这会发生这种情况,因为SessionAttribute是从ModelMap (在使用时被FlashAttributes取代)。 这是Spring中的错误还是故意行为? 如果是故意的,有人可以解释原因吗? 我认为SessionAttribute的目的是在完成会话会话之前保持SessionAttribute

类似StackOverflow发布在这里 。

附录

根据所提供的答案,我仍然难以理解如何在将URI参数放入用户会话时清除它们。 我考虑过的一个选项是为我试图存储的半原始对象(java.lang.Integer,java.lang.String)创建一个包装器,因为它们不会放在URI字符串上,但这似乎很难得我。 如果有人有更好的方式接受GET参数,将它们存储在用户的会话中,并清除用户地址栏中的那些(这将需要重定向),我很乐意使用它。

所以我正在寻找代码和互联网,找出它为什么不起作用。

Spring有两个完全独立的模型映射 – 一个用于标准视图渲染,另一个用于发布重定向。 这可以在ModelAndViewContainer观察到。

现在,会话属性持久性是基于mavContainer#getModel()的结果完成的 。 对于重定向方案,这将返回重定向模型。 因此,无论您在标准Model / ModelMapModelMap都会丢失。

在谈论标准模型属性时,这是有意义的。 模型主要是将对象传递给视图。 使用重定向时,您处理的是完全不同的情况。 您希望通过HTTP重定向传输对象 – 因此分离的字符串和基于闪存的模型。

但我的感觉是他们在设计此function时忘记了会话属性。 在Spring的Jira中有一些很好的讨论 ,但是没有一个讨论这个特定的问题。

所以是的……这可能是Spring的Jira的主题。可能被归类为错误,因为这可以防止任何人在使用重定向时设置会话模型属性。 强制Spring通过RedirectAttributes#addFlashAttribute存储你的会话属性RedirectAttributes#addFlashAttribute是IMO的一个黑客, 它本身就是一种bug