记得之前做用户还款划扣的时候,由于没有做有效的防重复点击,导致多扣账户的情况,现在把常用的几种处理方式总结如下;
- 网络延迟,一次函数的调用没有返回的情况下,再次点击submit提交按钮
- 提交后点击【刷新】按钮导致表单重复提交
- 提交表单后点击浏览器后退按钮回到表单重新提交
解决方案一:在form表单代码中设置一个js标识位,第一次提交后将标志设置为true;如下:
1 | <html> |
解决方案二:第一次表单提交之后,将表单按钮设置不可用《disabled》
1 | function dosubmit() { |
解决方案三:利用Session防止表单重复提交
- php生成唯一sign,存储在Session以及表单隐藏域中;
- 第一次Submit对比客户端与服务器端Session值,如果不一致那就是重复提交,如果一致则提交表单,成功后Unset Session域中存储的Sign;
1 | session_start(); |
解决方案四:数据库添加唯一字段
- 数据库添加唯一约束或者创建唯一索引;
实现思路:对请求信息进行hash运算,得到一个hash值,则相同的请求得到相同的hash值;
实现步骤:
- 接口A接收到请求之后,对请求信息hash运算,将hash值保存到数据库,对应列(column)满足unique约束,保存成功之后才能进行接下来的业务操作,比如提交订单,划扣等;
- 接口B接收到相同的请求,同样算出相同的hash值,当插入数据库时,由于column unique约束,所以保存失败;
隐患:程序中途挂了(网络超时,宕机…),后面重复提交,就无法成功了???
- 是否可以定时检测清理这个hash数据库表???