• 避免表单重复提交-PHP


    问题的起因是这样的:我们平台新增了支付方式,但后面他们测试的时候,发现有报订单异常(有订单号验证,发现有重复订单号,就不允许再次提交)的提示.

    开始我去看的时候,未能重现问题,后面在提交的时候,猛戳那个提交按钮,就出现异常提示,无法充值.我立即明白过来,这是重复提交的问题了.

    对于重复提交,两种解决办法: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');
         }); 
    })    

    在客户端处理可以增加用户体验,但恶意攻击者是可以绕过客户端的,所以为了安全性,还需要添加服务器端代码.

    现在看网上的一些文章,有些喜欢写的很全,很深.有时东西写了半天,其实也解决不了问题,对于语言理解不够的人来说,也不知道是否正确.示例也搞的很复杂的样子.

  • 相关阅读:
    通过索引优化sql
    索引概述
    Spring整合Mybatis
    Mybatis逆向工程
    Mybatis级联
    Mybatis动态语句
    Mybatis—curd
    (转)最大似然估计&贝叶斯估计
    筛法求质——poj2262&2909
    (转)poj1182食物链
  • 原文地址:https://www.cnblogs.com/ouzhenzhou/p/3363388.html
Copyright © 2020-2023  润新知