用户在操作表单Post数据时往往会出现表单数据重复提交的问题,尤其在Web开发中此类问题比较常见。刷新页面,后退操作以前的页面,单机多次按钮都会导致数据重复提交。此类问题是因为浏览器重复提交HTTP请求导致。
下面列出了四种比较常用的解决方案:
1
在数据库添加唯一字段
在数据库建表的时候在ID字段添加主键约束,账号,名称的信息添加唯一性约束。确保数据库只可以添加一条数据。
此方法从根本上的防止了数据重复提交。
2
用js为添加按钮禁用
当用户提交表单之后,可以使用js将提交按钮隐藏(disable属性),防止用户多次点击按钮提交数据。
注意:如果客户端禁用了js,则此方法无效。
3
使用Post/Redirect/Get
Post/Redirect/Get简称PRG,是一种可以防止表单数据重复提交的一种Web设计模式,像用户刷新提交响应页面等比较典型的重复提交表单数据的问题可以使用PRG模式来避免。例如:当用户提交成功之后,执行客户端重定向,跳转到提交成功页面。
注意:PRG设计模式并不适用所有的重复提交情况,比如:
1)由于服务器响应缓慢,用户刷新提交POST请求造成的重复提交。
2)用户点击后退按钮,返回到数据提交界面,导致的数据重复提交。
3)用户多次点击提交按钮,导致的数据重复提交。
4)用户恶意避开客户端预防多次提交手段,进行重复数据提交。
4
使用Session设置令牌
客户端请求页面时,服务器为每次产生的Form表单分配唯一的随机标识号,并且在orm的一个隐藏字段中设置这个标识号,同时在当前用户的Session中保存这个标识号。当提交表单时,服务器比较hidden和session中的标识号是否相同,相同则继续,处理完后清空Session,否则服务器忽略请求。
注意:恶意用户可利用这一性质,不断重复访问页面,以致Session中保存的标识号不断增多,最终严重消耗服务器内存。可以采用在Session中记录用户发帖的时间,然后通过一个时间间隔来限制用户连续发帖的数量来解决这一问题。