套接字连接到未签名Java小程序的原始服务器

我到处都读过,不允许未签名的Java小程序与任何服务器建立网络连接,而是发起小程序的网络连接。 这对我的应用程序来说没问题,因为我的applet只需要与服务器通信。 但是,当我编写测试applet以尝试打开套接字与我的开发机器上的进程通信时,它会抛出以下exception:

建立套接字连接出错:
 java.security.AccessControlException: 
  访问被拒绝(java.net.SocketPermission 127.0.0.1:11000连接,解析)

导致exception的代码:

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示例时,我得到了相同的exception。 这让我相信我确实遇到了设置问题,或者对默认安全限制存在误解。 默认安全管理器是否阻止您打开运行applet的计算机的套接字,即使它也是为applet提供服务的计算机? 如果是这样,那对我来说是个问题,因为部署的系统需要允许登录实际服务器的用户使用远程用户将使用的相同applet。 有没有办法绕过我得到的不涉及签名小程序的exception? 如果没有必要,我不想去找麻烦。

注意:我知道最好不让用户从服务器访问applet。 这不是最初的设计,但不幸的是,实际的考虑迫使这种实现方式对我不利。

更新:从Web服务器查看applet的页面可以解决问题。 即使服务器是localhost。 Java 1.6.0_11中的安全更新仅适用于直接从本地文件系统加载的applet。

这是由于最近的安全更新中引入的PlugIn发生了变化。 抱歉! 从本地文件系统加载的小程序不再被授予对localhost的套接字权限。

解决方案246387:Java运行时环境中的安全漏洞可能允许从本地文件系统加载的代码访问LocalHost

Java运行时环境(JRE)允许从本地文件系统加载的代码访问localhost。 这可能允许恶意放置在本地文件系统上然后运行的代码,以便具有对localhost的网络访问权限,如果代码是从远程主机加载的话,则不允许这样做。 这可以用来窃取cookie和劫持会话(对于将名称映射到localhost的域)。

我怀疑你是从本地HTML文件(例如applet.html)运行applet,这会引起Tom Hawtin提到的错误。

而是在您的计算机上运行Web服务器(例如Tomcat )并通过http://localhost/applet.html访问该文件

从web服务器中的servlet打开套接字端口可能会更好。 通过这种方式,您的Web服务器可以管理整个系统,并且可以更轻松地在计算机之间进行传输。

我在localhost和live上使用applet和servlet之间的套接字定期使用相同的设置。

Oracle知道严重限制Applet使用的Java问题:Java运行时环境中的安全漏洞可能允许从本地文件系统加载代码访问LocalHost是他们所说的。 这是Bug Id 6704154

他们的解决方案是:此问题没有解决方法; 这个“解决方法”于2008年12月3日发布。 因此,如果您希望将Applet与Tomcat或任何类似的服务器一起使用,则必须返回到Java 1.4.2

我花了一个多星期才完全记录这些事实,因为我在同一条船上。