在Spring中避免重复表单提交的最佳方法是什么?此框架是否提供了处理此问题的任何特殊功能(例如,作为Struts中的Synchronizer Token)?
答案 0 :(得分:37)
有多种方法可以避免双重提交,可以合并:
点击几毫秒后,使用JavaScript disable
按钮。这样可以避免多次提交是由不耐烦的用户多次点击按钮引起的。
提交后发送重定向,称为Post-Redirect-Get (PRG) pattern。这将避免多个提交是由用户在结果页面上按F5并忽略浏览器警告数据将重新发送,或者通过浏览器后退/前进按钮来回导航并忽略相同的警告。
请求页面时生成唯一标记,并将其放入会话范围和表单的隐藏字段中。在处理期间,检查令牌是否存在,然后立即从会话中删除它并继续处理。如果令牌不存在,则阻止处理。这样可以避免上述问题。
在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中显示为参数。因此,您可能希望尽可能保持属性尽可能薄。我通常做的是向用户显示一个实际上不包含任何唯一信息的页面,只显示“确认”消息。