为简单起见,这些代码片段将被缩短。这样做的目的是获取一个 GET 参数,在会话中设置它,然后重定向回 GET 并删除 url 参数。基本上,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
当重定向发生时,不知何故被取消设置。我可以通过将 a 传递ModelMap
给handleUrlParam
方法并手动添加myParam1
到 flash 属性来解决此问题,但这似乎违背了我的目的。
为什么SessionAttribute
myParam1
重定向后被删除?
有没有更好的方法从 URI 中提取参数并将它们放在会话中?
更新
因此,似乎无论何时使用RedirectAttributes
,都必须确保将SessionAttribute
要携带的任何 s 放入 FlashAttributes 上的重定向中,否则它们将丢失。我想这是因为SessionAttribute
s 被拉出ModelMap
(使用时被 FlashAttributes 取代)。这是 Spring 中的错误还是故意行为?如果是故意的,有人可以解释为什么吗?我认为SessionAttribute
s 应该一直保持下去,直到会话结束后被删除。
附录
鉴于提供的已接受答案,我仍然对如何在将 URI 参数放在用户会话中时清除它们感到困惑。我考虑过的一个选项是为我尝试存储的半原始对象(java.lang.Integer、java.lang.String)创建一个包装器,因为它们不会放在 URI 字符串上,但这似乎很棘手我。如果有人有更好的方法来接受 GET 参数,将它们存储在用户的会话中,并从用户的地址栏中清除它们(这将需要重定向),我会很乐意使用它。