我在网页中使用沙盒小程序(Java 8u25),该网页试图连接到同一服务器上的另一个端口。
在较旧的Java版本(前8版)中,这没有任何问题。
使用java 8,这种访问被视为跨域访问,因此尝试在目标端口上加载crossdomain.xml。
但在我的情况下,此端口不处理HTTP(我们自己的二进制数据协议),并且无法正确回答或根本不回答请求。
现在看来,applet没有针对该情况的超时,因此请求仍然停留在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-check以解决此问题?
编辑: 我只是注意到一些更邪恶的东西: 一旦一个呼叫在此时被卡住(即使我杀死线程),在任何线程中都不能成功进一步调用。我相信这是因为即使在中断或停止()卡住的线程时,也会保持某个锁并保持阻塞状态。 (interrupt()似乎根本没有效果。)
在沙盒applet中也不允许像这样设置全局连接超时:
System.setProperty("sun.net.client.defaultReadTimeout", "2000");
System.setProperty("sun.net.client.defaultConnectTimeout", "2000");
但是尝试从外部通过VM参数设置它们可能是值得的。
答案 0 :(得分:0)
我在一个网页中使用沙盒小程序(Java 8u25 [+/-]),该网页试图在相同的服务器上连接到另一个端口 强>
这是不可能的。
Oracle改变了行为,(但是,一如既往)我在他们的网站上找不到关于这个主题的消息。
看起来它在部署Java 8 Update 25的同一天生效。 但它似乎也对新插件所调用的旧Java-Install有影响。
您必须将权限更改(或引入)到所有权限。请记住,这可以在applet调用脚本,jnlp-file,Manifest,Applet-Viewer,...中定义(作为沙箱)