为简单起见,这些代码片段将会缩短。这样做的目的是获取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中提取参数并将它们放在会话中?
更新
因此,无论何时使用RedirectAttributes
,您都必须确保将要携带的任何SessionAttribute
放入FlashAttributes的重定向中,否则它们将丢失。我想这会发生这种情况,因为SessionAttribute
被拉出ModelMap
(使用时被FlashAttributes取代)。这是Spring中的错误还是故意行为?如果是故意的,有人可以解释原因吗?我认为SessionAttribute
s应该保持开启,直到完成对话会话后才会删除。
Similar StackOverflow post here
附录
根据所提供的答案,我仍然难以理解如何在将URI参数放入用户会话时清除它们。我考虑过的一个选项是为我试图存储的半原始对象(java.lang.Integer,java.lang.String)创建一个包装器,因为它们不会放在URI字符串上,但这似乎很难得我。如果有人有更好的方式接受GET参数,将它们存储在用户的会话中,并清除用户地址栏中的那些(这将需要重定向),我很乐意使用它。
答案 0 :(得分:6)
所以我在寻找代码和互联网,找出它无法正常工作的原因。
Spring有两个完全独立的模型映射 - 一个用于标准视图渲染,另一个用于发出重定向。这可以在ModelAndViewContainer
中观察到。
现在会话属性持久性已完成based on the result from mavContainer#getModel()
。对于重定向方案,这将返回重定向模型。因此,您在标准Model
/ ModelMap
上设置的内容将丢失。
在谈论标准模型属性时,这是有意义的。 Model主要是将对象传递给视图。使用重定向时,您处理的是完全不同的情况。您希望通过HTTP重定向传输对象 - 因此分离的字符串和基于闪存的模型。
但我的感觉是他们在designing this feature时忘记了会话属性。有一些不错的discussion in Spring's Jira,但是它们都没有解决这个特定的问题。
所以是的......这可能是Spring的Jira主题。 可能被归类为错误,因为这会阻止任何人设置会话使用重定向时的模型属性。强制Spring通过RedirectAttributes#addFlashAttribute
存储您的会话属性是IMO的一种黑客攻击和错误。