Ajax&;JavaScript |限制用户触发的请求

Ajax&;JavaScript |限制用户触发的请求,javascript,php,ajax,Javascript,Php,Ajax,我目前正在使用一些Ajax代码。我提出这个方案是为了尝试反映我的问题,看看你们,专家,是否能提出一个解决方案,谢谢 场景: #screenblocker { position:absolute; left:0px; top:0px; right:0px; bottom:0px; background-color:#ffffff; opacity:0.4; filter:alpha(opacity=40); z-index:9

我目前正在使用一些Ajax代码。我提出这个方案是为了尝试反映我的问题,看看你们,专家,是否能提出一个解决方案,谢谢

场景:

#screenblocker {
    position:absolute;
    left:0px;
    top:0px;
    right:0px;
    bottom:0px;
    background-color:#ffffff;
    opacity:0.4;
    filter:alpha(opacity=40);
    z-index:9999999;
}
document.getElementById('screenblocker').style.display = 'none';
我有一个这样的HTML按钮:

单击。单击此按钮后,将向php页面发出AJAX请求,如下所示:

function ajax_launch(){
    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = ajax_launch_callback;

    xmlhttp.open("POST", "/php_script", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send();
}

function ajax_launch_callback(){
    if(xmlhttp.readyState==4 && xmlhttp.status==200){
        // code to do something once response is here successfulyl 
    }
} 
然后在
PHP\u脚本
文件中执行一些PHP代码,并返回一个
$output

问题:

#screenblocker {
    position:absolute;
    left:0px;
    top:0px;
    right:0px;
    bottom:0px;
    background-color:#ffffff;
    opacity:0.4;
    filter:alpha(opacity=40);
    z-index:9999999;
}
document.getElementById('screenblocker').style.display = 'none';
通过AJAX调用的
php_脚本
页面非常繁重,并且会进行多次API和数据库调用,从而使页面加载“缓慢”(这很好)。然而,目前,当页面正在等待响应时(它仍在执行php,尚未返回任何内容),用户可以从技术上对按钮发送垃圾邮件以启动许多ajax调用。理想情况下,这只会对服务器产生压力,我需要一种方法,一旦请求被挂起而不再返回,您就不能发出进一步的请求

我怎样才能做到这一点

提前感谢,期待您的解决方案/咨询

另外:

#screenblocker {
    position:absolute;
    left:0px;
    top:0px;
    right:0px;
    bottom:0px;
    background-color:#ffffff;
    opacity:0.4;
    filter:alpha(opacity=40);
    z-index:9999999;
}
document.getElementById('screenblocker').style.display = 'none';
我所说的多个请求就是这个意思-请参见当我点击按钮发送多个请求时的图片,而第一个请求尚未完成(尚未返回任何内容):

您可以尝试以下方法:

var xmlhttp;
function ajax_launch() {
    if (xmlhttp && xmlhttp.readyState == 4 || !xmlhttp) {
        xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = ajax_launch_callback;

        xmlhttp.open("POST", "/php_script", true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.send();
    }
}

function ajax_launch_callback() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        // code to do something once response is here successfulyl 
    }
} 

虽然这里和链接问题中提到的javascript解决方案是一个不错的补充,但您确实应该在服务器端执行此操作,因为垃圾邮件发送者不一定使用浏览器和/或禁用javascript


如果在服务器上使用会话,则在处理请求时会话将被锁定,因此每个用户一次只能处理一个请求。但是,请求可能会排队(这可能是您的“网络”选项卡数据中显示的内容?),因此您可以通过对例如IP地址的速率限制来补充这一点。

以下内容可能会有所帮助:

添加此HTML

<div style="display: none;" id="screenblocker">&nbsp;</div>
和脚本部分:在AJAX调用之后

    var e = document.getElementById('screenblocker');
    if (e != null) {
        e.style.display = 'block';
        setTimeout("document.getElementById('screenblocker').style.display = 'none';", 5000);//considering 5 seconds to load, you can block longer if needed
    }
关于AJAX的成功:

#screenblocker {
    position:absolute;
    left:0px;
    top:0px;
    right:0px;
    bottom:0px;
    background-color:#ffffff;
    opacity:0.4;
    filter:alpha(opacity=40);
    z-index:9999999;
}
document.getElementById('screenblocker').style.display = 'none';

. 检查最后两个应答在请求进行时用加载图标标记按钮。让用户知道发生了什么我相信最好的方法是在php中进行检查,比如说会话!这将抛出一个引用错误,因为您试图在声明之前读取xmlhttp。@Quentin添加了声明,我假设它存在于未发布的代码中。但由于它是JS,用户可以更改它或创建自己的JS调用,对吗?@FlyingPheonix-是的,或者HTTP请求根本不使用JS,但是你提问的方式暗示你想解决“用户厌倦等待并再次点击”的问题,而不是“恶意用户发送尽可能多的请求”@Quentin对用户的意图并不重要,这是对我的服务器的影响。你能解释一下这个速率限制吗?正如您所说的,仍会有请求,如“我的网络”选项卡中所示,这不是问题吗?在我看来,这是一个额外的ajax调用。@FlyingPheonix例如,您可以获取访问者的ip地址,用时间戳将其记录到数据库中,然后在继续检查过去xx秒或分钟内已经存在多少条目的条目之前。