在Spring中重复表单提交

时间:2010-02-24 09:38:57

标签: forms spring spring-mvc form-submit

在Spring中避免重复表单提交的最佳方法是什么?此框架是否提供了处理此问题的任何特殊功能(例如,作为Struts中的Synchronizer Token)?

3 个答案:

答案 0 :(得分:37)

有多种方法可以避免双重提交,可以合并:

  1. 点击几毫秒后,使用JavaScript disable按钮。这样可以避免多次提交是由不耐烦的用户多次点击按钮引起的。

  2. 提交后发送重定向,称为Post-Redirect-Get (PRG) pattern。这将避免多个提交是由用户在结果页面上按F5并忽略浏览器警告数据将重新发送,或者通过浏览器后退/前进按钮来回导航并忽略相同的警告。

  3. 请求页面时生成唯一标记,并将其放入会话范围和表单的隐藏字段中。在处理期间,检查令牌是否存在,然后立即从会话中删除它并继续处理。如果令牌不存在,则阻止处理。这样可以避免上述问题。

  4. 在Spring中,您可以使用RedirectView作为PRG模式的实现(如第2点所述)。其他两点需要自己实现。

答案 1 :(得分:5)

这个页面似乎回答了你的问题(对于令牌问题,我的意思是。这里没有涉及问题的javascript和重定向后部分):

http://explodingjava.blogspot.com/2009/03/spring-mvc-synchronizer-token.html

答案 2 :(得分:4)

发布后只需重定向即可。表单提交成功后,返回ModelAndView时确保View是RedirectView。从用户的POV,他们提交表单,然后被重定向到另一个URL“GET”。这样他们就不会双重提交。

请注意,使用重定向视图时,模型属性会在URL中显示为参数。因此,您可能希望尽可能保持属性尽可能薄。我通常做的是向用户显示一个实际上不包含任何唯一信息的页面,只显示“确认”消息。