XDomainRequest против XMLHttpRequest на IE8 и IE9


Я очень запутался с реинкарнацией XMLHttpRequest и XDomainRequest и хотел бы получить некоторую помощь. Итак, вот мои выводы:

  1. XDomainRequest в IE8 и IE9, похоже, является каким-то подклассом XMLHttpRequest(?)
  2. XDomainRequest не имеет "withCredentials"
  3. в XDomainRequest отсутствует событие "onLoad", заставляющее вас использовать state и status IFs - EDIT: это не совсем верно. onLoad доступен, если вы создаете экземпляр XDomainRequest в IE8 и IE9. Однако если вы создадите экземпляр XMLHttpRequest в EI8 или IE9, onLoad будет недоступен. Ниже мы увидим, почему это важно.
  4. Кроме того, он передает данные в виде обычного текста, а не в виде формы, заставляющей вас анализировать поток ввода на заднем конце.
  5. Даже если директива CORS server "Allow-Headers" допускает чтение клиентом файла Set-Cookie, XDomainRequest не предоставляет его, делая невозможным использование идентификаторов сеансов, сохраненных в файле cookie, для аутентификации.
  6. Наконец если я не ошибаюсь, он позволяет только POST и GET http методы, что делает его бесполезным для RestFull веб-служб.
Этот список далеко не полон и, как я уже сказал, основан на моих выводах. Однако именно здесь начинается путаница. У меня есть приложение, где через Ajax я должен:
  • получить (кросс-домен) через GET ключ шифрования вместе с идентификатором сеанса, связанным с ним.
  • зашифруйте мой пароль пользователя с помощью этого ключа (здесь нет проблем)
  • Вход на крест домен (где я получил ключ на шаге 1), используя POST и x-www-form-urlencoded имя пользователя и зашифрованный пароль.

Теперь по всем вышеперечисленным причинам я не могу сделать это с помощью XDomainRequest:

  • Во-первых, потому что XDomainRequest:open(метод, url) отправляет только обычный текст, и мое стороннее приложение ожидает форму (я могу написать фильтр/перехватчик запросов, но это не главное).
  • потому что мой идентификатор сеанса, который приходит с ключом шифрования через Set-Cookie header (Шаг 1)никогда не отправляется обратно в кросс-домен при входе в систему в качестве заголовка, так как XDomainRequest не предоставляет заголовки.

Тем не менее, если в IE8 и IE9 я создаю экземпляр XMLHttpRequest, игнорируя все эти проверки, описанные здесь, все работает нормально!!! Хорошо, я не получаю onload событие, и я не уверен, что история с "withcredentials", но IE8 и IE9, кажется, не имеют никаких проблем с использованием XMLHttpRequest для кросс-домена. Но почему? Разве не все эти противоречия? Я просто пытаюсь разобраться в этой проблеме, так как боюсь, что использование XMLHttpRequest в IE8 и IE9 может вернуться и укусить в какой-то момент. Могу ли я попросить четкий пример, когда кто-то может использовать одно, а не другое? Еще лучше, было ли когда-либо обновление IE8 и IE9, которое решило эту проблему?

Любая помощь будет очень признательна Яннису

2 7

2 ответа:

Сначала обратите внимание на следующее:

IE11 не поддерживает объект XDomainRequest, и он недоступен в Пограничный режим IE11.

1) Что такое XDomainRequest и почему IE имеет этот объект? Несколько лет назад тогда XMLHTTPRequest 2 спецификаций разрабатывается консорциумом W3C всех браузерах построения уровня 2 за XMLHTTPRequest Уровень 1 корпорация Microsoft создать XDomainRequest. Таким образом, XDomainRequest не является подклассом, это нестандартная функция IE.

2) Да, XDomainRequest не имеет "withCredentials". Потому что:

Чтобы предотвратить неправильное использование внешних полномочий пользователя (например, файлов cookie, учетных данных HTTP, сертификатов клиента и т. д.), запрос будет удален из файлов cookie и учетных данных и будет игнорировать любые вызовы аутентификации или директивы Set-Cookie в ответе HTTP. XDomainRequests не будет отправляться на предварительно проверенных подключениях, так как некоторые протоколы проверки подлинности Windows (например NTLM/Kerberos) основаны на каждом соединении, а не на основе каждого запроса.

4)

По состоянию на 2014 год XDomainRequest не отправляет никаких типов контента вообще ничего не было. Мне непонятно, когда это изменилось.

И т. д. И так далее... Я публикую этот ответ только для истории.

Не используйте XDomainRequest. Это уродливо и Багли нестандартная функция.

Подробнее здесь:

  1. http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
  2. http://www.html5rocks.com/en/tutorials/cors/
  3. http://msdn.microsoft.com/en-us/library/ie/cc288060%28v=vs.85%29.aspx
  4. https://developer.mozilla.org/en-US/docs/Web/API/XDomainRequest
but IE8 and IE9 seems to have no problem using the XMLHttpRequest for cross domain

Это утверждение неверно.Единственный способ отправить CORS в IE8 / 9-это использовать нестандартный XDomainRequest.