如何在Spring MVC中的Post/Redirect/Get模式请求之间传递数据?

dan*_*nik 13 spring spring-mvc parameter-passing post-redirect-get

我有一个表单,使用POST signin.html提交用户名和姓

 @RequestMapping(value="/signin.html",method = RequestMethod.POST)
 public ModelAndView submit(@Valid User user){
    ModelAndView mv = new ModelAndView("redirect:signin.html"); 
    //Business logic with user account
    return mv;
 } 
Run Code Online (Sandbox Code Playgroud)

为了解决双提交问题,我使用GET请求重定向到相同的映射.

 @RequestMapping(value="/signin.html",method = RequestMethod.GET)
 public ModelAndView submitPRG(){
     ModelAndView mv = new ModelAndView("submitted");
     mv.addObject("message", "Submitted Correctly");
     return mv;
 }
Run Code Online (Sandbox Code Playgroud)

这样我解决了双提交问题.

我有几个问题:

1)我如何知道/signin.html上的GET请求来自重定向并且用户未在浏览器中请求?我只想关闭用户浏览http://server/signin.html并获得"正确提交"消息的选项.我知道我可以添加类似/signin.html?submitted=true的内容,但我想让它更干净.

2)有没有办法将ModelAndView对象传递submit()submitPRG()

或者在这种情况下,还有其他方法可以使用PRG吗?

axt*_*avt 17

您想要的行为称为"闪存范围".它通常通过存储在会话中重定向后显示的消息来实现.

Spring团队承诺在Spring 3.1(SPR-6464)中实现它.同时你可以看看mvc-showcase示例中flash范围的实现,这很简单,所以你可以自己动手.

替代方法是将所需数据添加为重定向URL的参数.请注意,如果您的提交方法保存模型对象以便稍后可以通过某个标识符访问它,则重定向到显示该对象的页面(即/users.html?userId=...代替/signin.html),并在该页面上显示"正确提交"消息是有意义的.闪光范围.

因此,flash范围通常用于传递消息,而不是模型对象.

  • 但是,你必须要小心使用闪存,因为它的时间一致性并没有得到严格保证.来自春季文档:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-flash-attributes这可能不是问题,但是至少要注意一些事情. (2认同)

thr*_*ups 4

我如何知道 /signin.html 上的 GET 请求来自重定向,并且不是用户在浏览器中请求的?

  • 您可以在他们的会话中存储标记
  • 查看HTTP header中的referer

我建议使用某种基于会话的消息传递“正确提交”消息。这有时称为“闪光”。StackExchange 一直使用这些(出现在屏幕顶部的消息)。

提前谢谢您,但是我如何从 HttpServletRequest 获取引荐来源网址?

HttpServletRequest.getHeader("Referer")
Run Code Online (Sandbox Code Playgroud)