如何防止用户同一个表单的多次提交

在通过js提交数据的时候,用户往往会因为得不到及时的响应多次提交,结果就是造成数据的多次提交,造成不好的结果。如何避免用户数据的多次提交呢?

  1. 可以前后端配合,在form的隐藏域中生成一个包含用户ip,url,时间的md5值,存储在form的隐藏域中,在服务端,检测到对应的md5值,与保存在缓存中的md5值对比,如果该md5值已经存在,证明重复提交,如果不存在,则证明刚刚提交,然后在缓存中置为该md5值,30s后失效。
  2. 第二种办法会有点麻烦,通过在具体的add函数那里检验sql语句,对比通过提交的数据与用户在表里面的最新数据,可以得到,用户的提交数据与已经插入的数据是不是同一份数据。因为主从的缘故,最新的数据要从主库读取。这样面临一个危险,就是面对攻击的时候,每次都从主库读取,可能会因此造成性能危机,
  3. 第三种方案是纯后台的,将插入sql进行md5,首先检查该md5值与缓存中的对应,如果有数据,就证明重复提交,如果没有数据,则置位该md5值,30s后失效,同时执行插入语句。优点是不需要和前端配合,单独的后台处理,并且,可以在add函数哪里添加判断,一处添加,整站收益。缺点是,md5会随着字符串的增加,时间线性增长,并且有相当的性能损失 http://hi.baidu.com/langwan/item/337eea599f9fa6444fff203d
  4. 第四种方案,纯前端的,在发起post请求之前,先将锁变量置位,然后在得到相应之后,将锁解除,同时设置一个计时,在超时得不到响应之后,依旧打开锁,并且在ui层面,适当的回馈用户,告知已经点击,请求发起

Leave a comment

Your email address will not be published.

*