23

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

4

3 回答 3

39

避免重复提交有多种方法,可以组合使用:

  1. disable单击几毫秒后对按钮使用 JavaScript 。这将避免由于不耐烦的用户多次单击按钮而导致多次提交。

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

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

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

于 2010-02-24T13:03:15.787 回答
5

此页面似乎回答了您的问题(我的意思是令牌问题。此处未涵盖问题的 javascript 和 post-redirect-get 部分):

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

于 2012-01-19T22:44:06.840 回答
4

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

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

于 2010-02-24T13:17:28.817 回答