Javascript表单提交创建大量的POST请求(多次提交)

时间:2016-02-11 17:55:38

标签: javascript php jquery

这是一个奇怪的问题,如果我没有提供所有信息,请随时编辑问题或询问更多信息。

如果用户没有在固定的时间内提交表单并在页面上显示倒计时时间,我会自动提交表单(定时测验)。

然而,当时间到期并且提交表单时,浏览器会进入奇怪的状态直到它崩溃,并且Apache日志显示无休止的POST请求列表。可能导致这种情况的原因是什么?

即使我关闭了浏览器窗口,服务器仍然会被POST请求命中。

如果我打开窗口,Chrome会最终显示失败消息,但是在显示此消息很久之后,POST请求仍然会进入(我会说最多一分钟后)。这里可以看到有问题的错误,以及记录POST请求的Apache日志文件:http://imgur.com/zAniD1q或者如果我设法在此处插入它: !http://imgur.com/zAniD1q

这是一个Wordpress网站,但由我大量定制。我的.htaccess文件很基本,我不认为这是问题所在。

相同的代码适用于网站的其他部分,以使事情更难理解。

我还测试了WAMP(Apache 2.2.22 / PHP 5.4.3)和运行PHP 5.5的生产服务器(不确定Apache版本)的相同行为。

PHP:

define('REDIRECT_LINK', '/finish-free-iq-test.php');

使用Javascript:

function update_time_remaining() {
    var start_time_millis = Math.floor(jQuery("#start_time").val());
    var redir_to = "<?php echo REDIRECT_LINK; ?>";
    var test_duration = <?php echo Question::get_duration($questionSetID) * 1000;?>;
    var now = new Date();
    var remainingTime = test_duration - (now.getTime() - start_time_millis);
    if (remainingTime <= 0) {
//        console.log("time is out, redir to: " + redir_to);
//        alert("stop=");
        // force-submit the form
        jQuery("#answerForm").attr("action", redir_to);
        jQuery("#answerForm").submit();
    }
    else {
        var minutesRemaining = Math.floor(remainingTime / 60000);
        var secondsRemaining = Math.floor((remainingTime - minutesRemaining * 60000) / 1000);
        jQuery("#timer").html("Time remaining : " + (minutesRemaining<10?"0":"") + minutesRemaining + ":" + (secondsRemaining<10?"0":"") + secondsRemaining);
        //console.log(secondsRemaining);
    }   
}

// Things to do once the page has loaded (start the clock for example)
jQuery(document).ready(function() {
    jQuery("#submitRow").hide();
    jQuery("#start_time").val(new Date().getTime() - <?php echo (time() - $timeStarted)*1000; ?>);
    update_time_remaining();
    // check every half a second so the ticking is consistent looking.
    window.setInterval("update_time_remaining()", 500);

HTML:

<div id="timer"></div> <br/>
<form id="answerForm" 
      method="POST" 
      action="<?php echo REDIRECT_LINK; ?>">

        <input id="submitRow" type="submit" name="go_next" value="Next question"> 

<?php echo "<input type=\"hidden\" name=\"current\" value=\"$id\">"; ?>
<input type="hidden" name="answer" id="answer" value="-1">
<input type="hidden" name="start_time" id="start_time" value="<?php echo $jsTimeStarted; ?>">

</form>

1 个答案:

答案 0 :(得分:2)

乍一看,看起来你没有任何能阻止&#34; update_time_remaining()&#34;以500毫秒的间隔被召唤。

这意味着&#39; if(remainingTime&lt; = 0){&#39;即使在计时器低于零之后,也会连续调用check,并导致重复的post调用直到页面被卸载。

可能包含一个布尔标志,允许只调用一次:

jQuery("#answerForm").submit();

一个好的解决方案是删除调用&update; time_time_remaining()&#39;提交被召唤后。

作为补充说明,请记住,因为这是一个仅限javascript的时间检查,具有足够专业知识(和时间)的人可以简单地禁用检查发生,并随时提交答案。一个很好的解决方案是检查该人在服务器端回答问题的时间。