Как сделать междоменную связь между JavaScript и Flash? - PullRequest
8 голосов
/ 17 января 2009

Как открыть «междоменную защиту», чтобы JavaScript на странице мог свободно взаимодействовать с SWF, даже если он размещен в другом домене?

Я точно знаю, что эта функция связи по умолчанию блокируется, но, играя с файлом с именем "crossdomain.xml" и функцией actionscript 3: system.Security.allowDomain ("*"). Однако я не достигаю полного успеха, и у меня нет понимания, кто из них открывает для чего.

Есть ли другие скрытые слои безопасности, о которых мне нужно подумать в этом сценарии?

И я как-то открываю свой код для потенциальных хакеров, выполняя эту настройку?

(и в случае, если вам интересно: да, у меня есть , чтобы выполнить эту работу в сценарии, где HTML размещен в одном домене, JavaScript добавляется извне из другого домена и SWF встроен в JavaScript из третьего домена - не спрашивайте почему, это слишком сложно объяснить - я бы тоже хотел разместить все это в одном домене).

Ответы [ 2 ]

17 голосов
/ 17 января 2009

Использование Security.allowDomain("www.example.com") в SWF позволит JS на странице www.example.com вызывать функции, представленные в SWF, с ExternalInterface.addCallback(). Домен и поддомен должны точно совпадать. Использование "*" позволит любому домену взаимодействовать с SWF, но если у вас есть один конкретный домен, лучше использовать его.

Установка allowScriptAccess на always в коде встраивания HTML позволит SWF вызывать функции JavaScript.

Одна вещь, которая бросается в глаза многим разработчикам, это то, что JavaScript не сможет вызывать функции в SWF, пока SWF не завершит загрузку. К сожалению, нет события на основе JS, которое сообщит вам, когда SWF будет готов (по крайней мере, я нашел). Обычно для решения этой проблемы я вызываю функцию JS из SWF сразу же после завершения загрузки SWF, чтобы уведомить страницу о том, что SWF готов.

Здесь и там есть некоторая абстракция, но если вы посмотрите на исходный код YUI Charts , вы сможете понять, как Yahoo! установил связь между доменами JS / SWF.

1 голос
/ 30 июня 2012

Одна вещь, которую я бы добавил к предыдущему ответу: если вы попробуете приведенный выше код, и он не работает, проверьте, содержит ли адрес вашего сайта "www" или нет. Мой не работал и не работал, если я написал это как

Security.allowDomain("www.jeremy-knight.com");

Мне нужно было написать это как:

Security.allowDomain("jeremy-knight.com");
...