我目前正在玩一些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调用。理想情况下,这只会在服务器上产生压力,我需要一种方法,一旦请求挂起而不回来,就无法再提出请求。
我怎样才能实现这样的目标?
提前致谢,期待您的解决方案/咨询
同时
通过多个请求,这就是我的意思 - 看看我垃圾邮件的时候点击按钮发送多个请求,而第一个请求没有完成(还没有返回任何内容):
答案 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"> </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';