用户在操作表单数据时往往总是重复提交数据,尤其是在web应用中此类问题相对不叫常见,用户网络缓慢当快速点击按钮多次,刷新页面后会出现多条数据或点击提交数据之后刷新页面再后退重复之前操作也会导致重复提交数据表单,此类问题导致原因是因为浏览器重复提交http请求导致。
下面简单介绍几种防止表单重复提交数据的方法:
1、Post/Redirect/Get
Post/Redirect/Get 简称PRG,是一种用来防止表单重复提交数据的一种Web设计模式,典型的重复提交form内容的情况像用户刷新提交响应页面等可通过PRG模式来得到避免。例如:当用户提交数据表单之后,执行一个客户端重定向操作,转到提交成功信息页面。
注意PRG设计模式并不能适用所有的表单重复提交情况,如以下几种情况:
1)用户点击浏览器返回表单页面,重新提交表单的情况; 2)用户在服务器端响应到达之前,多次点击提交按钮的时候。(可通过第2种方式,JavaScript控制提交按钮点击次数); 3)由于服务器响应缓慢,用户刷新提交POST请求造成的多次POST请求; 4)恶意用户避开客户端预防多次提交手段,进行重复提交请求。
2、禁用提交按钮
用户提交表单数据后使用JavaScript将提交按钮隐藏(使用disable属性,此属性提交数据不会生效),防止用户多次点击按钮提交数据,注意:如果客户端禁止JavaScript,此方法导致无效。
3、数据库增加约束条件
在数据库表中添加唯一约束或创建唯一索引,防止出现重复数据情况,此方法是最有效的防止提交重复数据的方式。
4、session存放特殊标志
用户提交表单页面时,生成一个特殊字符串存储到session中同时放入表单的隐藏域内,当提交表单数据成功时,检查标示字符串是否存在,如果存在立即删除session,之后正常处理表单数据,反之表单提交的数据没有有效字符串标志,说明表单已经提交忽略此次提交请求。