Android中的XmlHttpRequest双重发布问题

时间:2012-03-02 00:47:45

标签: javascript android security cordova

我已经在webserver中的网页上实现了一个简单的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

的问候,
奥利弗

2 个答案:

答案 0 :(得分:2)

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

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

我在工作中询问了一些建议,我得到的回应是让请求异步:

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

答案 1 :(得分:0)

你可以在document.ready函数中放置一个console.log来确保它不会被解雇两次吗?有时插件等会导致document.ready被触发两次。

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