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

And*_*ndy 5 java spring spring-mvc

为简单起见,这些代码片段将缩短.这样做的目的是获取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!
  }

}
Run Code Online (Sandbox Code Playgroud)

就像代码所说的那样,myParam1当重定向发生时,某种程度上是未设置的.我可以通过传递ModelMaphandleUrlParam方法并手动添加myParam1到flash属性来解决这个问题,但这似乎打败了我的想法.

为什么SessionAttribute myParam1在重定向后删除?

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

UPDATE

因此,无论何时使用RedirectAttributes,您都必须确保将SessionAttribute要携带的任何内容放入FlashAttributes的重定向中,否则它们将丢失.我想这会发生,因为SessionAttributes被拉掉了ModelMap(使用时被FlashAttributes取代).这是Spring中的错误还是故意行为?如果是故意的,有人可以解释原因吗?我认为SessionAttribute这是为了留下来,直到完成对话会话.

类似StackOverflow发布在这里.

附录

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

Pav*_*ral 6

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

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

现在会话属性持久性基于来自的结果mavContainer#getModel()完成.对于重定向方案,这将返回重定向模型.因此,无论你在标准上设置什么Model/ ModelMap都会丢失.

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

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

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