Установка Connection-Timeout для проверки crossdomain.xml в Java

Я использую изолированный апплет (Java 8u25) на веб-странице, которая пытается подключиться к другому порту на том же сервере.

В более старой Java-версии (до 8) это работало без проблем.

В java 8 такой доступ считается междоменным доступом и, таким образом, пытается загрузить crossdomain.xml на целевой порт.

Но в моем случае этот порт не обрабатывает HTTP (наш собственный протокол двоичных данных) и не отвечает должным образом или вообще не отвечает на запрос.

Теперь кажется, что у апплета нет времени ожидания для этой ситуации, и поэтому запрос остается в вызове CrossDomainXML.check().

Вот стек из дампа потока застрявшего апплета:

at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
- locked <0x058c2288> (a java.io.BufferedInputStream)
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
- locked <0x058c2328> (a sun.net.www.protocol.http.HttpURLConnection)
at sun.net.www.protocol.http.HttpURLConnection.access$200(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$9.run(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$9.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessController.doPrivileged(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
- locked <0x058c2328> (a sun.net.www.protocol.http.HttpURLConnection)
at com.sun.deploy.net.CrossDomainXML.check(Unknown Source)
at com.sun.deploy.net.CrossDomainXML.check(Unknown Source)
at sun.plugin2.applet.SecurityManagerHelper.checkURLPermissionHelper(Unknown Source)
at sun.plugin2.applet.AWTAppletSecurityManager.checkPermission(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.URLtoSocketPermission(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at myCode calling new URL("http://...").openConnection().connect();

Есть ли способ установить время ожидания подключения или как-то другим образом повлиять на проверку crossdomain.xml, чтобы решить эту проблему?

Редактировать: я только что заметил кое-что еще более злое: как только один вызов застревает в этой точке (даже если я уничтожу поток), дальнейшие вызовы не могут быть успешно выполнены в любом потоке. Я считаю, что это связано с тем, что определенная блокировка удерживается и остается заблокированной даже при прерывании или остановке () застрявшего потока. (interrupt(), кажется, вообще не имеет никакого эффекта.)

Кроме того, такая установка глобального тайм-аута соединения не разрешена в изолированном апплете:

System.setProperty("sun.net.client.defaultReadTimeout", "2000");
System.setProperty("sun.net.client.defaultConnectTimeout", "2000");

Но, возможно, стоит попробовать установить их через параметр VM извне.


person Frederic Leitenberger    schedule 15.10.2014    source источник


Ответы (1)


Я использую изолированный апплет (Java 8u25[+/-]) на веб-странице, которая пытается подключиться к другому порту на том же сервере >.

Это больше невозможно.

Oracle изменил поведение, (но, как всегда) я не нашел сообщения на эту тему на их сайте.

Похоже, что он вступил в силу в тот же день, что и развертывание Java 8 Update 25. Но, похоже, он также влияет на более старую Java-Install, вызываемую новым плагином.

Вы должны изменить (или ввести) разрешения на все разрешения. И имейте в виду, что это может быть определено (как песочница) в сценарии вызова апплета, jnlp-файле, манифесте, апплете-просмотрщике,...

person springfeld    schedule 19.11.2014