Как сделать междоменную связь между JavaScript и Flash?
-
19-08-2019 - |
Вопрос
Как открыть «междоменную защиту», чтобы JavaScript на странице мог свободно взаимодействовать с SWF, даже если он размещен в другом домене? р>
Я точно знаю, что эта функция по умолчанию заблокирована, но, поиграв с файлом с именем " crossdomain.xml " и функция actionscript 3: system.Security.allowDomain (" * "). Я не достигаю полного успеха, и у меня нет понимания, какой из них открыт для чего.
Есть ли другие скрытые уровни безопасности, о которых мне нужно подумать в этом сценарии?
И я как-то открываю свой код для потенциальных хакеров, выполняя эту настройку?
(и в случае, если вам интересно: да, у меня есть , чтобы выполнить эту работу в сценарии, где HTML размещается в одном домене, JavaScript добавляется извне из другого домена, и SWF встроен в JavaScript из третьего домена - не спрашивайте почему, это слишком сложно объяснить - я бы тоже хотел разместить все это в одном домене).
Решение
Использование 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 , вы можете понять, как Yahoo! установил межсистемную связь JS / SWF.
Другие советы
Одна вещь, которую я хотел бы добавить к предыдущему ответу: если вы попробуете приведенный выше код, но он не работает, проверьте, содержит ли адрес вашего сайта " www " или нет. Мой не работал и не работал, если я написал это как
Security.allowDomain("www.jeremy-knight.com");
Мне нужно было написать это как:
Security.allowDomain("jeremy-knight.com");