表单重复提交,数据库数据混乱怎么办? 有效防止表单重复提交的几种解决方法


js防止表单重复提交的两种方法

第一种:用flag标识,下面的代码设置checkSubmitFlg标志:

    <script language="”javascript”">     
    
    var checkSubmitFlg = false; 
    
    function checkSubmit(){ 
    
    if(checkSubmitFlg ==true){ return false; //当表单被提交过一次后checkSubmitFlg将变为true,根据判断将无法进行提交。 
    
    } 
    
    checkSubmitFlg ==true; 
    
    return true; 
    
    } 
    
    < /script >

第二种:在onsubmit事件中设置,在第一次提交后使提交按钮失效,代码如下:

    <script Language='JavaScript'>     
    function formsubmit() { 
    Today = new Date(); 
    var NowHour = Today.getHours(); 
    var NowMinute = Today.getMinutes(); 
    var NowSecond = Today.getSeconds(); 
    var mysec = (NowHour*3600)+(NowMinute*60)+NowSecond; 
    if((mysec-document.formsubmitf.mypretime.value)>600) 
    //600只是一个时间值,就是5分钟内禁止重复提交,值随你高兴设 
    { 
    document.formsubmitf.mypretime.value=mysec; 
    } 
    else 
    { 
    alert(' 按一次就够了,请勿重复提交!请耐心等待!谢谢合作!'); 
    return false; 
    } 
    document.forms.formsubmitf.submit(); 
    } 
    </script> 
    
    </HEAD> 
    
    <BODY BGCOLOR="#FFFFFF"> 
    <form name=formsubmitf id ="the" method="post" action="XXX.asp"> 
    <input type=hidden name='mypretime' value='0'> //这句不能少,用隐含变量传递一个时间初值


HTML/PHP防止表单重复提交的两种方法

1、使用Post/Redirect/Get模式。

在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。

 2、在session中存放一个特殊标志。

在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中,然后将表单页面发给浏览器,用户录入信息后点击提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除;不相等说明是重复提交,就不再处理。

这使你的web应用有了更高级的XSRF保护。

请见如下代码:

    <?php  
    session_start();  
    //根据当前SESSION生成随机数  
    $code = mt_rand(0,1000000);  
    $_SESSION['code'] = $code;  
    ?>  
    在页面表单上将随机数作为隐藏值进行传递,代码如下:  
    <input type="hidden" name="originator" value="<?=$code?>">  
       
        在接收页面的PHP代码如下:  
       
    <?php  
    session_start();  
    if(isset($_POST['originator'])) {  
    if($_POST['originator'] == $_SESSION['code']){  
    // 处理该表单的语句,省略  
    }else{  
    echo ‘请不要刷新本页面或重复提交表单!’;  
    }  
    }  
    ?>

3.使用header函数转向

除了上面的方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。

if (isset($_POST['action']) && $_POST['action'] == 'submitted') {

//处理数据,如插入数据后,立即转向到其他页面

header('location:submits_success.PHP');

}

这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。

4.表单过期的处理

在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。

1.使用header头设置缓存控制头Cache-control。

header('Cache-control: private, must-revalidate'); //支持页面回跳

2.使用session_cache_limiter方法。

session_cache_limiter('private, must-revalidate'); //要写在session_start方法之前

下面的代码片断可以防止用户填写表单的时候,单击“提交”按钮返回时,刚刚在表单上填写的内容不会被清除:

session_cache_limiter('nocache');

session_cache_limiter('private');

session_cache_limiter('public');

session_start();

//以下是表单内容,这样在用户返回该表单时,已经填写的内容不会被清空

将该段代码贴到所要应用的脚本顶部即可。

Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。

请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh和only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate和max-age。

5.使用Cookie处理

使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单,请见下面的代码:

    <?php    
    if(isset($_POST['Go'])){
    setcookie("tempcookie","",time()+30);
    header("Location:".$_SERVER[PHP_SELF]);
    exit();
    }
    if(isset($_COOKIE["tempcookie"])){
    setcookie("tempcookie","",0);
    echo "您已经提交过表单";
    }
    ?>

如果客户端禁止了Cookie,该方法将不起任何作用,这点请注意

关键词:
返回列表

相关文章

相关案例