ExternalInterface.addCallback в ActionScript работает только локально, а не на производстве - PullRequest
7 голосов
/ 15 января 2011

В моем приложении Flex мне нужен элемент управления Javascript для вызова одного из моих методов Actionscript. Достаточно просто, согласно документации Flex / Actionscript, я написал это в своем коде Actionscript:

if (ExternalInterface.available)
    ExternalInterface.addCallback("setName", setNameInActiveWindow);

В элементе управления Javascript я написал:

document.getElementById('FlexAppId').setName(name);

Отлично работает. Именно так, как и ожидалось, поэтому я пошел в производство. Но он не работает в производстве :(. Точно такой же код ... Я не могу понять. Вышеприведенный код Javascript выполняется, но обратный вызов не выполняется в коде Actionscript.

Это как-то связано с безопасностью домена? Локально я использую local.mydomain.com:8080, где local.mydomain.com разрешается до 127.0.0.1 (мне нужно сделать это, чтобы некоторые виджеты работали правильно). И приложение Flex поставляется с того же локального веб-сервера. Однако в производственном процессе это просто www.mydomain.com (mydomain.com не является реальным доменным именем), а приложение Flex происходит от flash.mydomain.com (CDN).

У меня есть файл crossdomain.xml по адресу www.mydomain.com:

.
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
        <site-control permitted-cross-domain-policies="master-only"/>
        <allow-access-from domain="*.mydomain.com"/>
</cross-domain-policy>

ОБНОВЛЕНИЕ : я пытался изменить локальную среду, чтобы ссылка на приложение Flex ссылалась на flash.mydomain.com, как в рабочей среде. Оказывается, я тоже получаю ту же проблему локально ... так что, похоже, это какая-то проблема безопасности домена, несмотря на файл crossdomain.xml, который у меня есть выше. Нужно ли что-то менять в моем файле crossdomain.xml? Есть ли что-то еще, что мне нужно, чтобы ExternalInterface.addCallback заработал?

ОБНОВЛЕНИЕ 2 : начало работать! Я должен был сделать и Security.allowDomain("*") и Security.allowInsecureDomain("*"). Установка его на flash.mydomain.com НЕ устранила проблему, я должен был установить шаблон. allowNetworking не имел никакого эффекта. Мне нужно allowScriptAccess="always", но у меня было это раньше. Вызов Javascript с ExternalInterface.call легко работает только с этим параметром. Но для добавления обратного вызова с ExternalInterface.addCallback требуются указанные выше методы безопасности с подстановочным знаком.

1 Ответ

2 голосов
/ 15 января 2011

Связь между вашим SWF и DOM не обрабатывается междоменным файлом. Этот вид взаимодействия между Flash-контентом и навигатором обрабатывается значениями allowScriptAccess и allowNetworking в html-оболочке SWF.

Поскольку SWF-файл и HTML-код не принадлежат одному и тому же квалифицированному домену, необходимо установить значение allowScriptAccess на всегда . Но будьте осторожны, потому что это означает, что если вы загрузите ненадежный контент в свой SWF-файл, он также получит доступ к странице DOM и, возможно, совершит вредоносные действия.

Для получения дополнительной информации, пожалуйста, посмотрите:

http://tv.adobe.com/watch/how-to-develop-secure-flash-platform-apps/scripting-and-allowscriptaccess/ http://kb2.adobe.com/cps/407/kb407748.html http://blogs.adobe.com/stateofsecurity/2007/07/how_to_restrict_swf_content_fr_1.html

...