如何将 Java RMI 限制到特定接口?

How can I restrict Java RMI to a specific interface?

我们的产品有两个接口,一个是面向客户的,另一个是内部接口。是否可以让 rmi 仅在特定接口(例如环回)上运行,或者我们是否需要使用防火墙规则来阻止访问?

有没有办法让服务器只绑定来自指定接口的请求?我发现这个可以在服务器上设置的属性,这是否阻止了外部请求?

-Djava.rmi.server.hostname=127.0.0.1

有没有办法让 rmiregistry select 像 mysql 的绑定选项一样监听接口?

这个问题似乎相关,但我希望得到一个更简单的答案: Java RMI: How can I restrict RMI method to only be called internally by the client object

I found this property that can be set on the server, does this prevent external request?

-Djava.rmi.server.hostname=127.0.0.1

属性 控制将什么 IP 地址放入从此 JVM 导出的删除对象的存根中。如果你想将这些限制为 'localhost' 设置的客户端,这实际上可行,但这不是一个很好的解决方案。

您必须使用 RMIServerSocketFactory 导出远程对象,创建 ServerSockets 绑定到您想要的特定 IP 地址。

Is there a way to have the rmiregistry select the interface it listens on like mysql's bind option?

同样的答案。您必须通过 LocateRegistry.createRegistry(int port, RMIServerSocketFactory ssf, RMIClientSocketFactory csf) 自行导出注册表。 csf当然可以为空。

如果您在导出的 JVM 中使用多个实例,请确保您的 RMIServerSocketFactory 具有 equals() 的合理实现,例如只要绑定的 IP 地址相同,它们就相等。

This question seems related

不是。