我有一个Spring-mvc应用程序,在每个控制器中,我向SessionAttributes添加了一个表单,以在保存,删除或执行另一个get请求时保留属性。当我尝试在另一个浏览器选项卡中打开某些链接并尝试提交第一个链接时,主要问题就变成了。我尝试了this解决方案,但是当我进行重定向(在控制器中,我只有1个返回视图,而其他方法进行了重定向)时,它将创建一个新会话,并且找不到上一个会话。
关于使用spring-session的这个尝试,我还有另一个问题,问题是here,但我不知道这是否也可以。
最佳答案
你看过Spring的RedirectAttributes吗?我自己还没有使用过它,但听起来它应该可以满足您的要求。 RedirectAttributes通常用于GET / redirect / POST模式,并且at least one user似乎认为以这种方式传递会话属性是不好的做法,但是他们继续提到,似乎没有更好的解决方案。无论如何,文档中显示的示例:
@RequestMapping(value = "/accounts", method = RequestMethod.POST)
public String handle(Account account, BindingResult result, RedirectAttributes redirectAttrs) {
if (result.hasErrors()) {
return "accounts/new";
}
// Save account ...
redirectAttrs.addAttribute("id", account.getId()).addFlashAttribute("message", "Account created!");
return "redirect:/accounts/{id}";
}
会将“message”属性添加到RedirectModel中,并且如果您的控制器进行重定向,则处理该重定向的任何方法都可以访问该数据,如下所示:
@RequestMapping(value = "/accounts", method = RequestMethod.POST)
public String handleRedirect(Model model) {
String message = (String) model.asMap().get("message");
return new ModelAndView();
}
因此,以相同的方式添加会话属性应该是可能的。另一个参考here。
编辑
我在浏览Spring文档时,他们还提到了这个批注@SessionAttributes。从文档中:
类型级别的@SessionAttributes批注声明特定处理程序使用的会话属性。这通常会列出模型属性的名称或模型属性的类型,这些名称应透明地存储在会话或某些会话存储中,用作后续请求之间的表单支持Bean。
这可能是您所需要的吗?
还有a link to documentation on flash attributes。