Каким образом Google Friend Connect осуществляет междоменное взаимодействие, не загружая файл в клиентский домен? - PullRequest
5 голосов
/ 08 октября 2009

Раньше в программе Google Friend Connect требовалось, чтобы пользователи загружали на свои веб-сайты пару файлов, чтобы обеспечить междоменное общение, а для Facebook Connect по-прежнему необходимо загружать один файл, чтобы включить его.

Теперь Friend Connect не требует загрузки файлов ... Мне было интересно, как им удалось это сделать.

Ссылка: http://www.techcrunch.com/2009/10/02/easy-does-it-google-friend-connect-one-ups-facebook-connects-install-wizard/

Ответы [ 5 ]

6 голосов
/ 10 января 2011

Существует несколько методов взаимодействия между документами в разных доменах, среди которых HTML5 postMessage, NIX, FIM (хэш / фрагмент), frameElement и использование свойства window.name.

Они доступны в разных браузерах и в разных версиях, но в совокупности они позволяют выполнять надежный XDM (междоменный обмен сообщениями).

Одним из проектов, который сделал это ранее, является Apache Shindig, который, вероятно, впервые применил несколько из них, а в последнее время появился проект easyXDM , объединивший все эти подходы с помощью общего API, легко создавать сложные приложения с использованием XDM и RPC.

Подробно о различных способах транспортировки данных вы можете прочитать в этой статье на Script Junkie .

Теперь, чтобы ответить на ваш вопрос напрямую, ранее было довольно распространенным считать, что доступен только postMessage, FIM (Fragment Identifier Messaging), и для того, чтобы последний работал эффективно, часто приходилось загружать специальный файл. на ваш домен. Поскольку было обнаружено больше методов, это было признано многими устаревшим, и поэтому; больше нет необходимости в файле.

Только для записи; Я являюсь автором как статьи Script Junkie, так и библиотеки easyXDM (кстати, этим пользуются Twitter, Disqus и многие другие).

4 голосов
/ 03 января 2011

Сейчас трудно запомнить / проверить, но я считаю, что мой ответ здесь, вероятно, был неправильным. Ответ Шона Кинси выше должен быть окончательным ответом на этот вопрос. Если вы читаете это, пожалуйста, подпишите его ответ и проигнорируйте мой.

Виджет Мастера сообществ Google работает так же, как и большинство объявлений / гаджетов, используя скопированный / вставленный фрагмент HTML для ссылки на включение JavaScript на сервере хоста, который затем создает фрейм, содержащий желаемый контент. Открыв iframe с идентификатором вашего сайта в URL-адресе, сервер Google может сгенерировать соответствующий HTML-документ для представления гаджета Friend Connect для вашего конкретного сайта / настроек.

Между начальным этапом создания iframe с соответствующим целевым URL-адресом не происходит никакого межсайтового взаимодействия. Все, что находится в динамически создаваемом iframe гаджета, больше похоже на то, что пользователь посетил отдельную страницу на сервере Google, но то, что было бы отображено, вместо этого встраивается / изолируется в блок на вашей странице.

0 голосов
/ 09 января 2011

Нет другого способа, кроме использования somewindow.postMessage(); для связи между междоменными фреймами.

До somewindow.postMessage() вам нужно было загрузить файл, чтобы убедиться, что вы можете установить связь между фреймами.

пример:

     <html>
<!-- this is main domain www.example.com -->
        <head>
        </head>
        <body>
      <iframe src="http://www.exampleotherdomain.com/">
      <script>
      function sendMsg(a) {

       var f = document.createElement('iframe'),
           k = document.getElementById('ifr');

           f.setAttribute('src', 'http://www.example.com/xdreciver.html#myValueisSent');
           k.appendChild(f);
           k.removeChild(f);
      }
      </script>


      <div id="ifr"></div>
      </iframe>
        </body>
        </html>

теперь содержание http://www.example.com/xdreciver.html html:

     <html>
<!-- this is http://www.example.com/xdreciver.html -->
        <head>
      <script>
      function getMsg() {

             return window.location.hash;
      }
      </script>
        </head>
        <body onload="var msg = getMsg(); alert(msg);">



        </body>
        </html>

Что касается использования .postMessage (); достаточно использовать top.postMessage('my message to other domain document, which is also the main document', 'http://www.theotherdomain.com');

0 голосов
/ 06 января 2011

JSON разрешает междоменный JavaScript.

  • Из-за ограничений безопасности браузера, большинство запросов "Ajax" подлежат та же политика происхождения; запрос не может успешно получить данные из другого домена, субдомена, или протокол.
  • Скрипт и JSONP запросы не подлежат тому же ограничения политики происхождения.
0 голосов
/ 08 октября 2009

Я не уверен, как это работает в данном конкретном случае, но междоменный обмен сообщениями может осуществляться либо с помощью API postMessage (), либо путем изменения хеш-части URL-адреса и отслеживания этого.

Метод изменения хэша работает, потому что и вложенные, и вложенные страницы имеют доступ к URL-адресу вложенной страницы.

Конечно, мы надеемся, что вызов API postMessage () со временем станет более стандартным.

...