我到处都读过,未签名的Java小程序不允许与任何服务器建立网络连接,而是发起小程序的网络连接。这对我的应用程序来说没问题,因为我的applet只需要与服务器通信。但是,当我编写测试applet以尝试打开套接字与我的开发机器上的进程通信时,它会引发以下异常:
Error establishing socket connection: java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:11000 connect,resolve)
导致异常的代码:
private void sendMsg(String msg) {
Socket s = null;
try {
s = new Socket("localhost", 11000);
}
catch (Exception e) {
System.err.println("Error establishing socket connection:");
e.printStackTrace();
return;
}
try {
OutputStream out = s.getOutputStream();
out.write(msg.getBytes());
out.flush();
s.shutdownOutput();
s.close();
}
catch (Exception e) {
System.err.println("Error in writing to the socket:");
e.printStackTrace();
}
起初我认为我的代码中存在一个问题,即我的经验不足让我错过了。但是,在尝试从官方Java教程中运行Talk Server示例时,我得到了相同的异常。这让我相信我实际上有一个设置问题,或者对默认安全限制的误解。默认安全管理器是否阻止您打开运行applet的计算机的套接字,即使它也是为applet提供服务的计算机?如果是这样,那对我来说是个问题,因为部署的系统需要允许登录实际服务器的用户使用远程用户将使用的相同applet。有没有办法绕过我得到的不涉及签名小程序的异常?如果没有必要,我不想去找麻烦。
注意:我知道最好不让用户从服务器访问applet。这不是最初的设计,但不幸的是,实际的考虑迫使这种实施方式对我不利。
更新:从网络服务器查看applet的页面可以解决问题。即使服务器是localhost。 Java 1.6.0_11中的安全更新仅适用于直接从本地文件系统加载的applet。
答案 0 :(得分:4)
这是由于最近一次安全更新中引入的PlugIn发生了变化。抱歉!从本地文件系统加载的小程序不再被授予对localhost的套接字权限。
Java运行时环境(JRE) 允许从本地加载代码 用于访问localhost的文件系统。这个 可能允许恶意代码 放在本地文件系统上 然后运行,拥有网络 访问不会的localhost 如果代码是,则允许 从远程主机加载。这可能是 利用来窃取饼干和劫持 会话(用于映射名称的域) 到localhost)。
答案 1 :(得分:2)
我怀疑你是从本地HTML文件(例如applet.html)运行applet,这会引起Tom Hawtin提到的错误。
而是在您的计算机上运行网络服务器(例如Tomcat)并通过http://localhost/applet.html
从web服务器中的servlet打开套接字端口可能会更好。通过这种方式,您的Web服务器可以管理整个系统,并且可以更轻松地在计算机之间进行传输。
我在localhost和live上使用applet和servlet之间的套接字定期使用相同的设置。
答案 2 :(得分:1)
Oracle知道严重限制Applet使用的Java问题:Java运行时环境中的安全漏洞可能允许从本地文件系统加载代码访问LocalHost是他们所说的。这是Bug Id 6704154
他们的解决方案是:此问题没有解决方法;这个“解决方法”于2008年12月3日发布。因此,如果您希望将Applet与Tomcat或任何类似的服务器一起使用,则必须返回到Java 1.4.2
我花了一个多星期的时间来全面记录这些事实,因为我在同一条船上。