XDomainRequest против XMLHttpRequest на IE8 и IE9
Я очень запутался с реинкарнацией XMLHttpRequest и XDomainRequest и хотел бы получить некоторую помощь. Итак, вот мои выводы:
- XDomainRequest в IE8 и IE9, похоже, является каким-то подклассом XMLHttpRequest(?)
- XDomainRequest не имеет "withCredentials"
- в XDomainRequest отсутствует событие "onLoad", заставляющее вас использовать state и status IFs - EDIT: это не совсем верно. onLoad доступен, если вы создаете экземпляр XDomainRequest в IE8 и IE9. Однако если вы создадите экземпляр XMLHttpRequest в EI8 или IE9, onLoad будет недоступен. Ниже мы увидим, почему это важно.
- Кроме того, он передает данные в виде обычного текста, а не в виде формы, заставляющей вас анализировать поток ввода на заднем конце.
- Даже если директива CORS server "Allow-Headers" допускает чтение клиентом файла Set-Cookie, XDomainRequest не предоставляет его, делая невозможным использование идентификаторов сеансов, сохраненных в файле cookie, для аутентификации.
- Наконец если я не ошибаюсь, он позволяет только POST и GET http методы, что делает его бесполезным для RestFull веб-служб.
- получить (кросс-домен) через 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 ответа:
Сначала обратите внимание на следующее:
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. Это уродливо и Багли нестандартная функция.
Подробнее здесь: