阿贾克斯& JavaScript |限制用户触发的请求

时间:2016-06-21 13:07:25

标签: javascript php ajax

我目前正在玩一些Ajax代码。我想出了这个场景,试图反映我的问题,看看你们,专家,是否可以提出解决方案,谢谢。

情境:

我有一个像这样的HTML按钮:<p onclick="ajax_call();">Click</p>。单击此按钮后,它将向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_script文件中执行一些PHP代码并返回$output

问题:

通过AJAX调用的php_script页面非常沉重,并且会进行多次API和数据库调用,使页面加载速度很慢(这非常好)。但是目前,当页面正在等待响应时(它仍在执行php并且尚未返回任何内容),用户可以在技术上垃圾按钮以启动许多ajax调用。理想情况下,这只会在服务器上产生压力,我需要一种方法,一旦请求挂起而不回来,就无法再提出请求。

我怎样才能实现这样的目标?

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

同时

通过多个请求,这就是我的意思 - 看看我垃圾邮件的时候点击按钮发送多个请求,而第一个请求没有完成(还没有返回任何内容):

Image of chrome debugger (networks tab)

3 个答案:

答案 0 :(得分:2)

虽然这里和链接问题中提到的javascript解决方案是一个很好的补充,但你应该真的做这个服务器端,因为垃圾邮件发送者不一定会使用浏览器和/或可能禁用javascript。

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

答案 1 :(得分:1)

你可以试试这个:

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 
    }
} 

答案 2 :(得分:0)

这可能会有所帮助:

添加此HTML

<div style="display: none;" id="screenblocker">&nbsp;</div>

这种风格:

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

和脚本部分:在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的成功:

document.getElementById('screenblocker').style.display = 'none';