Проблема двойной публикации XmlHttpRequest в Android - PullRequest
4 голосов
/ 02 марта 2012

Я реализовал простую запись 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

С уважением,
Oliver

Ответы [ 2 ]

2 голосов
/ 16 апреля 2012

Я столкнулся с той же проблемой, однако обнаружил, что она не относится к родному браузеру (также пробовал с Skyfire). На этих трех телефонах Android задержка перед повторным запросом была (последовательно):

  • Samsung Galaxy S2: 30 секунд
  • HTC Desire: 60 с
  • HTC Sensation: 60 сек

Я попросил совета на работе, и я получил ответ, чтобы сделать запрос асинхронным:

Сделайте так, чтобы сервер обрабатывал запрос асинхронно и немедленно отвечал на запрос POST с 201, включая местоположение, указывающее на страницу состояния / URL, указывающую ход выполнения запроса POST. Клиент может получить ход выполнения запроса с помощью GET по этому URL.

0 голосов
/ 04 марта 2012

Вы можете поместить console.log в функцию document.ready, чтобы убедиться, что это не ТО, что запускается дважды?иногда плагины и т.д. могут привести к тому, что document.ready будет запущен дважды.

, возможно, попробуйте вызвать функцию в событии ondeviceready , как описано здесь: http://docs.phonegap.com/en/1.4.1/phonegap_events_events.md.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...