使用RedirectAttributes.addFlashAttribute时,在刷新后将对象保留在视图中

时间:2013-04-23 22:04:50

标签: java spring java-ee spring-mvc

感谢Spring 3.1,我可以使用RedirectAttributes.addFlashAttribute进行Post / Redirect / Get,但它似乎有小问题

这是持久化表单对象的方法,然后重定向到视图以显示该表单对象:

@RequestMapping(value = "/{formType}/onTheEarch", method = RequestMethod.POST)
public String submitAndRedirect(SomeWebForm someWebForm,
        @PathVariable("formType") String formType,
        final RedirectAttributes redirectAttributes) {

            // do something according to formType
            // .......

            redirectAttributes.addFlashAttribute("webObject", webObject);
            String view = "redirect:/formType/toTheMoon";
    }

这是将用户定向到显示表单对象的视图的方法

@RequestMapping(value = "/{formType}/toTheMoon", method = RequestMethod.GET)
public String submitAndRedirect(@PathVariable("formType") String formType) {
            // do something according to formType
            // .......
            String view = "toTheMoon";
    }

到目前为止这么好,但有一个缺陷。当我刷新视图toTheMoon时,一切都消失了。所以这里的问题是

(1)How does `RedirectAttributes.addFlashAttribute` works? 
(2)How can I keep the object from "FlashAttribute" even after refreshing the page?

我知道第二个问题,我们可以避免RedirectAttributes.addFlashAttribute并只传入URL中的任何参数来实现RGP pattern,但是,我尽量避免这种情况,因为参数值是敏感的,不应该在浏览器上向用户公开。那该怎么办?

1 个答案:

答案 0 :(得分:4)

正如spring documentation chapter 17.6

所述
  

Flash属性在重定向之前暂时保存(通常是   在会话中)在重定向后可用于请求   并立即删除。

如果您希望结果持续多次请求,您可以将它们存储在具有某些标识符的会话中,并将标识符作为请求参数传递给结果页面

我通常做的其他方法是检查结果页面上是否存在结果模型,如果不是仅仅重定向到错误页面(即:用户不想直接按刷新/访问结果页面,如果它们只是出现错误)。然后使用javascript

进行客户端刷新防护