有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java SocketPermission客户端端口?

我一直在开发一个在ApacheTomcat6中部署的web应用程序,运行Java6Update31。需要包含一个模块,该模块将简单地侦听端口X上的传入TCP流量,以供将来处理。在我们启用Java安全管理器(IA需求)之前,一切都很顺利

启用后,我们开始获取AccessControlExceptions,但这是意料之中的,因为我们的策略文件中没有明确允许这种流量。因此,我在Tomcat的“catalina.policy”文件中添加了以下行(其中54321是应用程序正在监听的端口):

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

然而,我们仍然看到AccessControlException,例如:

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

查看该错误行,我注意到“192.168.1.50”实际上是客户端的IP,所以“1527”必须是socket的客户端端口。这可以通过以下事实来验证:每次尝试此操作时,此端口都会发生更改

所以,我的问题是:为什么我的web应用程序需要关心客户端端口?我的理解是,传出连接只是使用任意/随机端口。在我看来,关于这个策略文件,我只需要指定我想要监听的端口。然而,我能让它工作的唯一方法是在上面的权限行中将“54321”改为“*”,从而向世界开放JVM

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

谢谢, 道格


共 (1) 个答案

  1. # 1 楼答案

    套接字权限*:54321/accept允许您使用远程端口54321接受来自任何主机的连接。这没有多大意义,但是像192.168.1.50://accept这样的权限允许您使用任何端口接受来自192.168.1.50的连接

    如果要侦听端口54321上的传入连接,则需要权限*:54321/listen(不接受)。您可以结合这些权限来描述允许Java进程监听哪些本地端口,以及允许它从哪些远程主机接受连接