2012-04-24 125 views
0

我一直在开发一个部署在运行Java 6 Update 31的Apache Tomcat 6中的Web应用程序。需要包含一个模块,该模块将简单地侦听端口X上的传入TCP流量以供将来处理。在我们开始启用Java安全管理器(IA安全管理器)之前,一切都很顺利。SocketPermission - 客户端端口?

一旦启用,我们开始越来越AccessControlExceptions,但这是意料之中的,因为没有在我们的政策文件已明确允许该流量。所以,我添加以下行到Tomcat的“ca​​talina.policy里”文件(其中54321是应用程序所侦听的端口):

grant { 
    permission java.net.SocketPermission "*:54321", "accept, resolve"; 
}; 

然而,我们仍然看到AccessControlExceptions,如:

java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.1.50:1527 accept,resolve) 

望着那错误行,我注意到,“192.168.1.50”实际上是客户端的IP,所以“1527”必须套接字客户端端口。这是由这个口内的各该尝试时间变化的事实验证...

所以,我的问题是:为什么我的web应用程序需要关心客户端?我的理解是,传出连接只是使用任意/随机端口。在我看来,在我看来,就这个政策文件而言,我只需要指定我想听的端口。但是,只有在上述权限行中将“54321”更改为“*”,才能使此工作起作用,从而将JVM打开到全世界。

我误解了这里的语法吗?如何确保我的应用程序接受来自任何客户端端口的任何主机在服务器端口54321上的连接?

感谢, 道格

回答

0

的套接字权限*:54321 /接受允许您接受使用遥控端口54321这并没有多大意义的任何主机连接,但许可象例如192.168.1.50:*/accept将允许您使用任何端口接受来自192.168.1.50的连接。

如果你想监听端口54321的传入连接,你需要一个许可*:54321 /听(不接受)。您可以组合这些权限来描述您的Java进程允许监听哪些本地端口以及允许哪些远程主机接受连接。

+0

这对我来说是有意义的,除了在Javadoc上为SocketPermission发现以下内容: '“listen”操作仅在与“localhost”' [(SocketPermission)](http:/ /docs.oracle.com/javase/6/docs/api/java/net/SocketPermission.html) – 2012-04-24 18:36:46

+0

问题是?你想听远程服务器上的传入连接吗? – jarnbjo 2012-04-25 12:31:49

+0

所以,只是澄清...假设192.168.1.50是远程客户端的IP,我会包含两个SocketPermission行:localhost:54321/listen,192.168.1.50:*/accept? – 2012-04-25 14:55:26