5

为简单起见,这些代码片段将被缩短。这样做的目的是获取一个 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 传递ModelMaphandleUrlParam方法并手动添加myParam1到 flash 属性来解决此问题,但这似乎违背了我的目的。

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

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

更新

因此,似乎无论何时使用RedirectAttributes,都必须确保将SessionAttribute要携带的任何 s 放入 FlashAttributes 上的重定向中,否则它们将丢失。我想这是因为SessionAttributes 被拉出ModelMap(使用时被 FlashAttributes 取代)。这是 Spring 中的错误还是故意行为?如果是故意的,有人可以解释为什么吗?我认为SessionAttributes 应该一直保持下去,直到会话结束后被删除。

类似的 StackOverflow 帖子在这里

附录

鉴于提供的已接受答案,我仍然对如何在将 URI 参数放在用户会话中时清除它们感到困惑。我考虑过的一个选项是为我尝试存储的半原始对象(java.lang.Integer、java.lang.String)创建一个包装器,因为它们不会放在 URI 字符串上,但这似乎很棘手我。如果有人有更好的方法来接受 GET 参数,将它们存储在用户的会话中,并从用户的地址栏中清除它们(这将需要重定向),我会很乐意使用它。

4

1 回答 1

7

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

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

现在会话属性持久化是基于mavContainer#getModel(). 对于重定向场景,这将返回重定向模型。因此,您在标准Model/上设置的任何内容ModelMap都会丢失。

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

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

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

于 2013-06-15T17:06:16.137 回答