问题的起因是这样的:我们平台新增了支付方式,但后面他们测试的时候,发现有报订单异常(有订单号验证,发现有重复订单号,就不允许再次提交)的提示.
开始我去看的时候,未能重现问题,后面在提交的时候,猛戳那个提交按钮,就出现异常提示,无法充值.我立即明白过来,这是重复提交的问题了.
对于重复提交,两种解决办法:1.客户端;2.服务器端.
1.服务器端
每个订单号只能提交一次,已有订单号验证,所以这里可不处理.
但对于其他的表单,可以在表单中加入
<input type='hidden' value="<?=uniqid()?>" id='duplicate' name='duplicate' />
然后在处理请求的时候
$uid = '';//用户名 if(isset($_SESSION[$uid]) && $_SESSION[$uid] == $_POST['duplicate']){ //跳转提示重复提交 }else{
$_SESSION[$uid] = $_POST['duplicate'];
}
2.客户端
我JS不好,不会写一些高深的东西来避免页面表单重复提交.
第一种方法:HTML+JS
<!--增加onsubmit触发事件--> <form action='./index.php' method='get' onSubmit='checkSubmit();'> <!--添加id,便于选择--> <input id='payImg' type='image' src='' />
<script type="text/javascript"> function checkSubmit(){ $('#payImg').attr('disabled',true); } </script>
每提交一次,就添加元素属性disabled,并将之设置为true
第二种方法:JS
无需再添加HTML的东西,只需添加JS即可
这样可捕捉页面form表单的提交事件,每次提交后,对页面提交按钮添加并设置disabled属性
$(function(){ $('form').submit(function(){ $(':submit',this).attr('disabled','disabled'); }); })
在客户端处理可以增加用户体验,但恶意攻击者是可以绕过客户端的,所以为了安全性,还需要添加服务器端代码.
现在看网上的一些文章,有些喜欢写的很全,很深.有时东西写了半天,其实也解决不了问题,对于语言理解不够的人来说,也不知道是否正确.示例也搞的很复杂的样子.