我一直在开发一个 Web 应用程序,该应用程序部署在 Apache Tomcat 6 中,运行 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 的连接?
谢谢,道格