Sergiy Shychynov (Sergei Shichinov) Kiev, Ukraine Flex/JavaScript blog (JavaScript, Flex, ActionScript, AS3, AIR) | http://www.linkedin.com/in/shichinov | http://shichinov.moikrug.ru

Wednesday, March 13, 2013

Flash Player's "crossdomain.xml" vs JBoss7's "welcome-content"

Every body knows what "crossdomain.xml" is for. But it is sacral knowledge that it is ignored if it does not have right Content-Type: application/xml

Ситуация была проста:
1) SWF грузится из одного домена по HTTP:
http://shdom1:8082/ui/soaptest.swf
2) И он должен пользоваться SOAP Web Services из другого домена HTTPS:
https://shdom2:8443/ws/Appl?wsdl

И оно конечно же не грузится:
- причем выдает нечто невинное "Error #2170: Security sandbox violation: http://localhost:8080/acwui/ACWMain.swf cannot send HTTP headers to https://localhost:8443/acw/Application."
  faultCode = "Channel.Security.Error"
  faultDetail = "Destination: DefaultHTTP"
  faultString = "Security error accessing url"
  message = "faultCode:Channel.Security.Error faultString:'Security error accessing url' faultDetail:'Destination: DefaultHTTP'"


Но на самом деле, после глубинного дебага, видим root cause "Error #2048: Security sandbox violation: http://localhost:8082/acwui/soaptest.swf?debug=true cannot load data from https://localhost:8443/acw/Application?wsdl"

Перечитываем до дыр описание файла доменных политик crossdomain.xml
Узнаем все необходимое:
  • и про мета-полиси в мастер файле (permitted-cross-domain-policies=«all»)
  • и про доступ на HTTPS домены (security=«false»)
  • и про хедеры SOAP Сервисов ()

То есть все делалось правильно и в соответствии с документацией
http://www.senocular.com/pub/adobe/crossdomain/policyfiles.html

Мастер crossdomain.xml максимально разрешающий выглядит так:

 
 
 


Но все равно ничего не работает...

Итого - потрачено больше двух дней, перечитана до дыр документация по политикам безопасности, сделано два тестовых прототипа, перепробованы различные версии Flex SDK, а заодно научились JBoss хачить - и вуаля:

Проблема заключалась в том что по умолчанию JBoss7 отдавал нам этот файл из корня сервера (welcome-content) без http хэдера Content-Type !!!

А без этого HTTP хедера оно этот мастер кроссдомен просто игнорило. А так как по умолчанию считается что , то и все остальные локальные кроссдомены игнорились.

Но как только мы подхачили этот чудный JBoss7 чтобы он отдавал кроссдомену нормальный Content-Type: application/xml ,то тут же все заработало!!!

Делается это так:
1) Выключаем в jboss-7.1.1\standalone\configuration\standalone.xml использование "welcome-content"
2) деалем ROOT.war

  • \ROOT.war\WEB-INF\web.xml
  • \ROOT.war\crossdomain.xml

3) диплоим его - для этого нужно поместить его в диплой (и возможно создать там файл ROOT.war.dodeploy )

Готово. Наслаждайтесь вашими кроссдоменными коммуникациями. (Кстати - нормальный томкат отдает нормальный контент тайп сразу - из пакета).

Собственно на правильную мысль натолкнули следующие два факта:
  •  в документации про мета политики мастера кроссдомена, есть упоминание о таком режиме безопасности при ктором правильными считаются только такие crossdomain.xml у которых Content-Type: text/x-cross-domain-policy
  • потом я начал экспериментировть с другим вебсервером - взял обычный Tomcat вместо JBoss7 - и обнаружил что на томкате оно работает.
Ну а дальше - найти в чем тут дело -  было делом техники.

Followers