Привет всем гуру Java/Applet,
Я наткнулся на интересную проблему с последней сборкой JDK (1.8.0_b26).
При запуске Java-апплета Sandbox с последней версией JDK из кода Java мы пытаемся подключиться к серверу по другому протоколу — вместо исходного HTTPS мы используем WSS (защищенное соединение через веб-сокеты, мы используем стороннюю библиотеку Websockets Client Java). В результате JVM пытается получить crossdomain.xml
файл с сервера. Проблема в том, что файл извлекается по протоколу HTTP (а не HTTPS).
Например, в нашем случае IP-адрес сервера — 192.168.1.1, апплет загружается через порт HTTPS по умолчанию (443). Используя уровень трассировки 5 в консоли Java, мы видим, что crossdomain.xml
извлекается из http://192.168.1.1:443
. И, конечно же, это не работает, потому что сервер прослушивает только соединения HTTPS через порт 443 (а не HTTP).
С другой стороны, когда мы используем HTTP-протокол и открываем новый WS (незащищенное подключение через веб-сокеты) к серверу, проблема не возникает, потому что crossdomain.xml извлекается из http://192.168.1.1:80
, и это полностью правильно.
По мере дальнейшего изучения проблемы мы сделали еще несколько наблюдений:
Можно указать альтернативное расположение файла
crossdomain.xml
с помощью параметраjnlp.altCrossDomainXMLFiles
Java VM. Однако нам никогда не удавалось заставить этот параметр работать на нас (пробовали как в списке java_arguments, так и в качестве одиночного параметра апплета). Возможная причина может заключаться в том, что параметр следует использовать только с приложением Webstart (хотя это специально не прописано в спецификациях).При установлении соединения Websockets трассировка стека соединений выглядит следующим образом:
на sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:790) на sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647) на sun.net.www.http.HttpClient.parseHTTPHeader (HttpClient.java:787) по адресу sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647) по адресу sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1534) по адресу sun. net.www.protocol.http.HttpURLConnection.access$200(HttpURLConnection.java:90) на sun.net.www.protocol.http.HttpURLConnection$9.run(HttpURLConnection.java:1431) на sun.net.www.protocol. http.HttpURLConnection$9.run(HttpURLConnection.java:1429) в java.security.AccessController.doPrivileged(собственный метод) в java.security.AccessController.doPrivileged(AccessController.java:713) в sun.net.www.protocol.http .HttpURLConnection.getInputStream(HttpURLConnection.java:1428) на com.sun.deploy.net.CrossDomainXML.check(неизвестный источник) на com.sun.deploy.net.CrossDomainXML.check(неизвестный источник) на sun.plugin2. applet.SecurityManagerHelper.checkConnectHelper(неизвестный источник) в sun.plugin2.applet.AWTAppletSecurityManager.checkConnect(неизвестный источник) в sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:624)
Итак, мы рассмотрели последний общедоступный исходный код класса CrossDomainXML.java (правда, еще с 2010 года). И из кода видно, что при получении файла crossdomain.xml
с сервера всегда используется http-соединение, независимо от исходного соединения браузера.
Итак, вопросы:
Может быть, это ошибка JDK или строгое использование HTTP для
crossdomain.xml
предусмотрено дизайном?Поддерживается ли параметр
jnlp.altCrossDomainXMLFiles
JVM внутри апплета Sandbox?Есть ли способ получить доступ к последней версии исходного кода
com.sun.deploy.net.CrossDomainXML.java
, чтобы получить полную картину происходящего?
Заранее большое спасибо.
С уважением, Марк
1.8.0_b26
далеко не «последняя сборка JDK». Между этой бета-версией и самой последней версией существует более одной версии выпуска. Последняя сборка JDK:jdk1.8.0_20
илиjdk1.8.0_40_b06
. - person Holger   schedule 23.09.2014jdk1.8.0_40_b06
- тот же результат. Также исследовал переменнуюjnlp.axlCrossDomainXMLFiles
дальше. Кажется, он доступен для апплета Sandbox (без исключений безопасности), но я не нахожу способа заставить его работать. - person Mark V.   schedule 23.09.2014