【问题标题】:XmlHttpRequest double posting issue in AndroidAndroid中的XmlHttpRequest双重发布问题
【发布时间】:2012-03-02 00:47:45
【问题描述】:

我已经实现了一个简单的 AJAX 发布(通过 JS XmlHttpRequest 对象)到网络服务器中的网页。

但是,我在 Android OS 2.X 的默认浏览器上观察到一个奇怪的症状/问题 也就是说,如果由于某种原因有足够长的延迟让网络服务器返回响应(可以通过在网页中硬编码 Thread.Sleep 来模拟),浏览器会自动将相同的请求重新发布到网络服务器在等待期间再次。

<script type="text/javascript">
     $(document).ready(function() {
        PerformRequest();
    });

    function PerformRequest() {
        appendMessage('PerformRequest... ');

        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("POST", "http://localhost/DelaySite/Default.aspx", true);
        xmlhttp.onreadystatechange = function()
            {
            appendMessage("xmlhttp.readyState: " + xmlhttp.readyState, true);
            appendMessage("xmlhttp.status: " + xmlhttp.status, true);
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                // successful response
                }
            }
        xmlhttp.send();
    }
</script>

有人在 Android 浏览器中看到过这个问题吗?如果有,有谁知道原因吗?

这不应该被视为一个安全问题吗?如果移动设备和主机之间存在足够长的网络延迟,请考虑每个请求可能会发出两次的情况。

但是,我无法在 ICS 中复制此问题,只能在 Android OS 2.X 中复制

问候,
奥利弗

【问题讨论】:

标签: javascript android security cordova


【解决方案1】:

我遇到了同样的问题,但是我发现它不是特定于本机浏览器的(也尝试使用 Skyfire)。在这三款 Android 手机上,重复请求之前的延迟是(始终):

  • 三星 Galaxy S2:30 秒
  • HTC Desire:60 秒
  • HTC Sensation:60 秒

我在工作中四处询问建议,我得到的回应是使请求异步:

使服务器异步处理请求并立即使用 201 响应 POST 请求,其中包括指向状态页面/url 的位置,指示 POST 请求的进度。客户端可以通过 GET 到此 url 来检索请求的进度。

【讨论】:

    【解决方案2】:

    您能否在 document.ready 函数中添加一个 console.log 以确保它不会被触发两次?有时插件等会导致 document.ready 被触发两次。

    也许尝试在 ondeviceready 事件中调用该函数,如下所述:http://docs.phonegap.com/en/1.4.1/phonegap_events_events.md.html

    【讨论】:

    • 我已经确认不是 document.ready 被触发了两次。此外,我没有测试混合 android 应用程序,只是纯粹的运行 AJAX 调用的 html 页面。仅当主机响应以一定延迟返回时才会出现这种重复发布问题。
    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多