我一直在开发一个部署在Apache Tomcat 6中的Web应用程序,运行Java 6 Update 31.需要包含一个模块,它只是监听端口X上的传入TCP流量,以便将来处理。在我们启用Java安全管理器(IA要求)之前,一切都很顺利。
启用后,我们开始获取AccessControlExceptions,但这是预期的,因为我们的策略文件中没有任何内容明确允许此流量。所以,我将以下行添加到Tomcat的“catalina.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 :(得分:0)
套接字权限*:54321 / accept允许您使用远程端口54321接受来自任何主机的连接。这没有多大意义,但允许使用例如192.168.1.50:*/accept允许您使用任何端口接受来自192.168.1.50的连接。
如果要侦听端口54321上的传入连接,则需要权限*:54321 / listen(不接受)。您可以组合这些权限来描述允许Java进程侦听哪些本地端口以及允许哪些远程主机接受连接。