Обмен на данни между домейни
Търсене във форума |
подробно търсене |
Към страницата. |
Обмен на данни между домейни. Част 2.
HTML5: postMessage
Стандартът HTML5 предвижда изпращане на javascript съобщение от един прозорец в друг чрез специално извикване window.postMessage.
В този случай прозорците могат да бъдат от всеки домейн, няма значение. Например, единият iframe е от yandex.ru, а другият е от vaysapupkin.info. За да получава съобщения между домейни, прозорецът за получаване регистрира специален манипулатор на съобщенията, в който, наред с други неща, може да провери от кой домейн е дошло съобщението.
Примерът по-долу използва iframe от домейна javascript.ru, чийто източник е даден по-долу, и iframe от домейна ilyakantor.ru.
Както можете да видите, съобщението е препратено добре. Примерът работи в браузъри Firefox 3.5, Opera 10, Safari 4.0/Chrome 3.0+, Internet Explorer 8.0.
Прозорец за изпращане
Източник на прозореца, изпращащ съобщението:
Както можете да видите, за да изпратите съобщение, е достатъчно да извикате метода postMessage(message, targetOrigin) на прозореца за получаване.
съобщение Съобщението е javascript обект targetOrigin Целевият домейн, от който трябва да бъде прозорецът, който получава съобщението. Ако не искате да ограничавате целевия домейн - вместо това поставете звездичка "*".
прозорец за получаване
Изходният код на прозореца за получаване (в iframe):
Манипулаторът на събитие onmessage проверява домейна на източника, който е в свойството event.origin, и ако всичко е наред, показва съобщението event.data.
Всичко е прозрачно и удобно.
Реализирането на postMessage от браузърите използва вътрешен механизъм за предаване на съобщения, така че можете да предавате всякакви обекти, носамият факт на предаване не се проследява по никакъв начин от сниферите на пакети.
Интерфейсът се поддържа от основните съвременни браузъри.
XMLHTTPRequest 2 / XDomainRequest
Вторият стандарт XMLHTTPRequest 2 се развива дълго време в W3C.Междувременно Firefox 3.5, Safari 4/Chrome 3 и IE8 вече са внедрили редица функции.
Например, междудомейн заявки.
Следващият пример изпраща заявка от текущия домейн (javascript.ru) към домейна ilyakantor.ru.
Не работи в по-стари браузъри и. в Опера.
Заявка между домейни се изпраща точно по същия начин като обикновен XMLHttpRequest, но браузърът изпраща допълнителен хедър Origin към сървъра.

Сървърът в отговора посочва със заглавката Access-Control-Allow-Origin за кои домейни са налични данните. Отговор на сървъра:

Ако изведнъж домейнът, до който идва отговорът, не съвпада с Access-Control-Allow-Origin (можете да посочите звездичка "*" за всеки домейн), тогава браузърът блокира операцията от съображения за сигурност.
Внедряване
Докато Firefox/Safari разшири обикновения XMLHTTPRequest обект, Microsoft представи нов XDomainRequest обект за междудомейн заявки.
И двата обекта имат много сходни интерфейси, но решението Firefox/Safari прилага по-пълно XMLHTTPRequest 2. По-специално се поддържат методи, различни от GET/POST, поддържа се Cookie/HTTP Auth и контролите за достъп са разширени.
Изходният код на iframe, изпращащ заявката:
Както можете да видите от примера, и в двете реализации е възможно да се откажете от onreadystatechange и да използвате събитията onload/onerror/onabort.
Освен това, считано от Firefox 3.5/Safari 4/IE8, събитието onprogress се поддържа за прилагане на прогресбар.
Разбира се, възможно е да се напише обвивка за различни браузъри, която прозрачно изпраща заявки, използвайки тези нови методи в допълнение към съществуващите.
Допълнителни материали
Покрихме основите на новите начини за междудомейн комуникация. При практическо изпълнение може да се нуждаете от подробности.
Мога да препоръчам следните статии.
Ако сценарият ще даде нещо на някого, тогава да.
Искахте да кажете междусайтово, т.е. кръстосано домейн a.com b.com
Гостът, който е публикувал по-горе и viglim:
изглежда не сте забелязали реда за факта, че сървърът, към който е направена кръстосаната заявка (дори има пояснение относно скрипта на сървъра), трябва да позволява заявки да се правят към себе си и може да игнорира някого.
следователно сигурността вече ще зависи от директността на ръцете на тези, които използват тази позиция.
Страхотно е, че прекарах половин ден в търсене на решение за прехвърляне на заявка от един от моите сайтове към друг и готово. Благодаря на автора. Ще отбележа от себе си: един прост скрипт само в няколко реда работи на Mozilla (3.6) за мен без излишни украшения (все още не съм го проверил в други браузъри), всичко, което е написано тук, не работи за мен, въпреки че примерите на тази страница работят както е написано. Ех, твърде мързеливо, за да се ровя в бъгове.
За да прехвърля параметри на друг сайт, просто написах реда, посочен в статията и това е всичко:
За да прехвърля параметри на друг сайт, просто написах реда, посочен в статията и това е всичко:
И къде се регистрира? Имам подобна ситуация, получавам "null" от сървъра на Origin и празен отговор. Казвам.
IE 7 и IE 6 ще развалят кръвта на програмистите за дълго време, като не дават възможност да използват тези чипове, а това е малко повече от 10% според статистиката на li
XMLHTTPRequest 2ако не се лъжа, ако направи заявка към друг домейн, преди това първо иска същата страница с метода OPTION. и след това има заявка или GET или POST или нещо друго.
Не става от локален файл - трябва да се качи на реален сървър Това е жалка патерица!
Интересно е, че чрез проксито Yahovsky работи отвсякъде, включително от локален файл.
XMLHTTPRequest 2 / XDomainRequest В наскоро пуснатата Opera 12.00 направи
моля, кажете ми, че е много необходимо. И как правилно да формираме повикване към прозореца, ако трябва да изпратим повикване от iframe към прозореца за повторно влизане? или как да се позова на не вложен, а съседен iframe? (въпрос относно метода postMessage)
За да изпратите съобщение до родителския прозорец, използвайте конструкция като top.postMessage. Но до следващия кадър, доколкото си представям модела за сигурност за междудомейн заявки, това е възможно само през родителския прозорец.
Но е по-добре да не преоткривате колелото, а да използвате библиотека като easyXDM (има и плъгин jQuery за работа с postMessage). Там всичко това е реализирано доста удобно, включително механизма за извикване на отдалечени процедури, който е добавка за точно такъв транспорт (или друг, ако браузърът не го поддържа).
момчета Curl е тук, за да ви помогне. Вие изпращате заявка до php на вашия домейн, Curl изпраща заявка до друг и ви връща отговор. Ако операта все още работеше с това, щеше да е нормално. И така през фреймове или изпращане по Ajax. Ами нафиг. В php това са 5 реда и пълна съвместимост между браузъри))
Това не винаги е така и не е за всеки. Понякога трябва да използвате клиентската страна.
Curl, wget и всякакви други сървърни рокери за еднократни задачи, докато се зареждакъм сървъра, което се улеснява и ускорява от Ajax.
Моля, помогнете ми да разреша този проблем. Прави се POST заявка между домейни за изпращане на файл, отговорът съдържа низ с идентификатора на добавения обект (Content-type: text/plain). Всички браузъри адекватно премахват този ред с xhr.responseText, но в IE10 xhr.responseText винаги е празен. Какво може да има там?
IE11, FR29.0.1 Тази функция не се поддържа в този браузър.