如何防止AJAX服务器端传输?

Posted

技术标签:

【中文标题】如何防止AJAX服务器端传输?【英文标题】:How to prevent AJAX server side transmission? 【发布时间】:2012-12-30 08:50:34 【问题描述】:

不询问如何中止 AJAX。

在这种情况下,有谁知道如何防止服务器传输?

例如,在动态分页中,用户可能一次快速滚动 1 行,从而导致很多请求。

这可以在客户端 jQuery 上使用abort 轻松取消,但是对于我们这些在带宽分配上吝啬的人来说,我们如何才能在收到新请求时阻止先前的请求传输?

非常感谢!

具体说明

其实是因为我使用的是jQuery UI Slider,并且设置了slide事件来命中服务器。

如您所料,如果您将这个傻瓜滑过 10%,服务器就会像疯了一样被击中,并且仍在传输所有数据,即使我已经 aborted。

这是问题的真正根源,因为(在我看来)快速按下向上或向下按钮可能无法停止。

【问题讨论】:

【参考方案1】:

我想我想多了。

在动态分页的情况下,我想我可以在 php 的开头设置一个等于microtime(true)$_SESSION,并将它保存在一个变量中。

在传输(或任何其他资源密集型步骤)之前,我可以检查它是否仍然相等。如果没有,exit

但是,如果其他人可以提出允许多个并行请求的通用解决方案,他们会得到我的检查和 +1。

【讨论】:

您是否已经查看过php.net/manual/en/features.connection-handling.php? @RobW 啊,谢谢你提供的知识! jQuery 的ajax 是否发送所需的中止代码?中止时默认的 PHP 设置是否为exit(或等效项)?再次感谢! 您必须中止请求本身。为此,您需要将$.ajax() 调用的结果存储在某处,并在创建新请求时调用.abort()(假设变量存在)。每当请求成功或失败时,使变量无效以释放资源。【参考方案2】:

在这种情况下,您可以考虑使用服务器发送的事件。这将打开一个持久的 HTTP 连接,用于将数据从服务器传输到客户端。这样可以防止客户端快速请求数据并浪费带宽。示例代码:

服务器端:(PHP)

<?php
@set_time_limit(0);
header('Content-type: text/event-stream');
header('Transfer-encoding: chunked');
while(true)
    echo 'data:'.$data."/n/n";//todo: send data here
    ob_flush();
    flush();

?>

客户端:(javascript)

var ev = new EventSource('path/to/script');
ev.onmessage = function(e)
    var data = e.data;
    //todo: handle data here
;

希望对你有帮助。

【讨论】:

顺便说一下,IE10 不支持 SSE。此外,SSE 并没有解决核心问题,即检测请求何时中止。 caniuse.com/#feat=eventsource 如果你希望连接是双向的,那么你可以使用websocket,但在php中很难设置。 但是SSE可以在需要的时候发送数据,并且只使用一个连接。

以上是关于如何防止AJAX服务器端传输?的主要内容,如果未能解决你的问题,请参考以下文章

ajax 使用POST方法传的数据服务端怎么接

如何防止重复发送ajax请求

JS583- 如何防止重复发送ajax请求

纯Ajax上传图片到服务器端

Ajax——三种数据传输格式

Ajax 数据传输格式—HTML