我正在使用PHP根据某些条件回显具有动态输入值的表单:
<?php
//when user lands on the login page, he is presented with a form.
//if he logged in with the incorrect password, the variable $attempts will increment by 1.
$failed_attempt = $attempts > 10 ? 'failed' : '' ;
echo '
<form id="form_login">
<input type="hidden" name="failed_attempt" id="failed_attempt" value="'.$failed_attempt.'" />
<input type="hidden" name="current_time" id="current_time" value="'.date('Y-d-m H:i:s').'" />
<input type="text" name="uid" id="uid" placeholder="Username/e-mail">
<input type="password" name="pwd" id="pwd" placeholder="password">
<button type="submit" name="login_submit" id="login_submit">Login</button>
</form>';
echo '<p id="result"></p>';
?>
...和表单上的Ajax提交以获取错误和成功消息,而无需刷新页面:
$(document).ready(function(){
$('#login_submit').click(function(event) {
// document.location.reload(true);
event.preventDefault();
$.ajax({
url: "includes/login.inc.php",
//'<?php echo $form_action; ?>',
method: "post",
data: $('#form_login').serialize() + "&submit_login",
dataType: "text",
success: function (html, data) {
$('#result').html("Ajax Success Status:" + data + "<br>Result:" + html);
}
});
});
});
但是,由于使用Ajax提交表单,因此页面永远不会“刷新”,因此用户始终看到相同的表单,并且无论$ failed_attempts值是多少,输入都保持不变。用户单击带有无效密码的“提交”。
我的问题是,在用户提交表单之前,如何“刷新”表单或仅一次输入?如果我取消对该部分的评论
// document.location.reload(true);
那么用户将永远看不到错误/成功消息,而且他也不知道出了什么问题。
我尝试了不同的方法,没有一个是正确的(即,无论采用哪种方法,我总是会遇到这样的情况。一旦我最终得到了一个非详细的方法,我仍然遇到问题输入字段保持不变,除非用户实际上自己刷新页面!)。
P.S。原因是:恐怕僵尸程序或DoS攻击者将能够多次提交该表单,并且如果它在x分钟内达到10次以上的尝试,我就必须停止登录。