<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Чудо{вищные} заметки</provider_name><provider_url>https://miracle.rpz.name</provider_url><author_name>MiRacLe</author_name><author_url>https://miracle.rpz.name/author/miracle/</author_url><title>Cross Domain XMLHttpRequest</title><html>Задачи обмена информацией ставятся и успешно решаются каждый день. Но обмениваться можно по-разному. Кто-то дарит удобоваримый доступ к своей базе посредством распространённых обменных форматов (xml, csv, json, lisiy_chert), кто-то реализует собственные API, а кто-то идёт другими путями.

Моя задача состояла в следующем - на ресурсах-сателитах необходимо разместить сложную форму. &quot;Сложность&quot; формы заключается в том, что данные подгружаются с главного ресурса и не могут быть загружены единовременно(при загрузке ресурса) или доставлены на ресурс-сателит заранее (так-так данных очень много и они достаточно быстро устаревают). Всевозможные API для доступа к информации основного ресурса в настоящий момент разрабатывать нецелесообразно, поэтому было решено для сателитов предоставлять некий готовый комплекс (аля plug-n-play).
&lt;blockquote&gt;
Ещё до начала разработки я тщательно изучил уже имеющиеся механизмы для межсайтового обмена данными. Первым и самым перспективным был вариант использования flash-плеера, но единственный вменяемый пример &lt;a href=&quot;http://blog.monstuff.com/archives/000294.html&quot;&gt;FlashXmlHttpRequest&lt;/a&gt; был только лишь примером, а не законченным куском кода, которым бы можно было воспользоваться. &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; на тот момент даже не содержала функции $.getScript,  &lt;a href=&quot;http://dklab.ru/lib/JsHttpRequest/&quot;&gt;JSHttpRequest&lt;/a&gt; с созданием тега script удачно справлялся, но POST по понятным причинам делать не мог.
&lt;/blockquote&gt;
Данные с главного ресурса могут подгружатся  посредством динамического создания тега script &lt;a href=&quot;http://docs.jquery.com/Ajax/jQuery.getScript&quot;&gt;jQuery.getScript&lt;/a&gt;, с этим казалось бы проблемы нет. Но! Но последним шагом в указанной форме нужно отправить на основной сервер внушительный объём данных, которые могут не влезть в GET (тоже кстати говоря весьма интересный вопрос - а каково ограничение на длину URL в разных браузерах? в различных веб-серверах,прокси и фильтрах? - в &lt;a href=&quot;http://www.ietf.org/rfc/rfc2616.txt&quot;&gt;RFC2616&lt;/a&gt; об этом не сказано). Можно конечно изобрести какие-либо механизмы, например отправлять данные небольшими порциями GET-ом, но скорости такая схема явно не прибавит, поэтому такие варианты оставлены другим изобретателям.
&lt;!--more--&gt;

В первом рабочем варианте проблема решалась php-скриптом на сервере-сателите, через который данные POST-ом прокачивались на головной сайт. Но такая схема имела ряд недостатков, основным из которых опять же является скорость работы и дополнительное требование к ПО на сервере (наличие PHP) или требование к нам, разработчикам - создать прокси-скрипт для других распространнёных серверных платформ. 

&lt;strike&gt;И вот относительно недавно&lt;/strike&gt; я наткнулся на занимательную библиотеку &lt;a href=&quot;http://flxhr.flensed.com/&quot;&gt;flxhr&lt;/a&gt;. Автор довёл до конца идею и наваял интерфейс, который может &lt;b&gt;прозрачно заменять XMLHttpRequest&lt;/b&gt; используя flash. Использовать flxhr легко и просто - &lt;a href=&quot;http://flxhr.flensed.com/code/tests/flxhr-7f.html&quot;&gt;заменяете стандартный XMLHTTPRequest&lt;/a&gt; и дальше всё почти как обычно. 

В дополнение ко всему, флеш-плеер решает ещё одно требование к разрабатываемому проекту - необходимо пресечь бесконтрольное распространение клиентского модуля(который устанавливается на сайт-сателит). Дело в том что в флеш-плеер от рождения встроен механизм контроля над внешними данными. Ранее это был ресурс crossdomain.xml в корне веб-сервера, содержащего скачиваемые данные. В нём описывалось откуда и что можно скачать. В новом плеере (а для использования flxhr необходим плеер версии не ниже 9.0.0.124) появился более удобный механизм - можно указать путь к ресурсу с политиками &lt;a href=&quot;http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html#goal_control&quot;&gt;policyURL&lt;/a&gt;.

&lt;blockquote&gt;
 Кстати о версии плеера:  автор flxhr предусмотрел не только проверку версии плеера, но и возможность его апгрейдить не отходя от кассы (тот самый &lt;a href=&quot;http://blog.deconcept.com/swfobject/#expressinstall&quot;&gt;expressinstall из swfobject&lt;/a&gt;).
&lt;/blockquote&gt;

 Думаю стоит ещё раз упомянуть тот факт, что данная схема &lt;b&gt;не позволит&lt;/b&gt; обратиться js-скрипту с произвольного сайта A на произвольный ресурс B без согласия его владельца. &quot;Согласие&quot;  выражается в виде правил, описываемых в файле crossdomain.xml(или указанным в loadPolicyFile), который располагается на сервере B. Другими словами данные, которые вы желаете публиковать, не должны быть &quot;ворованными&quot;.

 Единственным неудобством, с которым пока довелось столкнуться в ходе обкатки flxhr, является тот факт, что данные в кодировке отличной от UTF-8 безвозвратно портятся. В остальном это самый &lt;b&gt;лёгкий и удобный&lt;/b&gt; способ обмениваться данными между разными доменами уже &lt;b&gt;сейчас&lt;/b&gt;, не дожидаясь появления сверхновых версий браузеров, в которых реализуют &lt;a href=&quot;http://dev.w3.org/2006/webapi/XMLHttpRequest-2/&quot;&gt;XMLHttpRequest Level 2&lt;/a&gt;, и скоропостижной смерти всех старых.
</html><type>rich</type></oembed>