使用单一的RMI注册表

8
我正在进行一个项目,使用RMI技术。我希望将多个主机绑定到单个RMI注册表上。但是,当我尝试这样做时,出现错误提示:java.rmi.AccessException: Registry.Registry.bind disallowed; origin / 192.168.0.9 is non-local host。经过一些搜索,我发现默认情况下,RMI会阻止远程主机进行绑定。请问是否有一种方法可以覆盖或绕过此限制?如果有任何建议,请不吝赐教。我已经尝试使用不同的策略文件和覆盖安全管理器,但似乎都无法解决问题。
5个回答

7

有一种方法可以绕过这个限制,但它只是一个权宜之计。无论如何,请随意尝试。对我们有效。

在运行中央RMI注册表的主机上运行一个小服务,该服务将绑定一个仅具有一个远程方法proxyRebind的远程对象。此方法的实现只需将供应的对象绑定到中央注册表中(这不会失败,因为注册表与此服务位于同一台机器上)。

所有其他主机只需查找此远程对象并使用自己的远程对象调用proxyRebind。

这样做是可行的,因为允许在远程托管的注册表上查找。您最初的尝试失败是因为不允许在远程托管的注册表上进行绑定。

如果您需要进一步的澄清,请告诉我。

/ RS


聪明!听起来像是未来JRE版本中可能被关闭的潜在安全漏洞。我不会让任何重大设计决策依赖于这种技术。 - A. Levy
如果要关闭,早就会发生了!我已经实施了这项工作长达10年! - user40552
rndm.buoy 我已经尝试实现了这个,对象确实成功绑定,但是当我尝试调用远程方法时,我会得到异常 java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: 即使远程对象应该解析为 IP 192.168.126.137。我想知道是否有什么我漏掉的东西,你能否详细说明一下你的建议,将不胜感激。 - Mark Davidson

2

2 有一个绕过限制的方法,但它只是一个解决方法。无论如何,随意尝试一下。对我们来说有效。

在运行中央RMI注册表的主机上运行一个小服务,该服务将绑定一个具有仅一个远程方法:proxyRebind的远程对象。此方法的实现仅会将提供给它的对象绑定到中央注册表中(这不会失败,因为注册表位于与此服务相同的计算机上)。

所有其他主机将简单地查找此远程对象并使用自己的远程对象调用proxyRebind。

这能够工作是因为允许在远程托管的注册表上进行查找。您最初的尝试失败是因为不允许在远程托管的注册表上进行绑定。

如果需要进一步澄清,请告诉我。

这个方法完全有效。唯一需要注意的是始终正确设置以下内容。 -Djava.rmi.server.hostname="LOCAL HOST IP"


只有在多宿主机上或者DNS出现问题时,才需要设置java.rmi.server.hostname,详见RMI FAQ中的A.1条款 - user207421

1

如果我误解了你的问题,请告诉我。

我在Java RMI方面经验有限,我们在代理模式的设计模式课程中使用它。(教材:Headfirst Design Patterns)

我们无法从大学网络外部使项目正常工作,但是当直接连接到网络时,它们可以完美地工作。根据我们的教授,不可能在互联网或广域网上使用RMI来实现我们的实现。她建议的解决方案是需要VPN。我相信弗拉基米尔是正确的,这与它是本地命名服务有关。


不是的。这与在具有客户端代理的网络上实现回调有关,并涉及RMI FAQ中A.1项描述的问题。“本地命名服务”只是想象中的东西。 - user207421

0
感谢大家的回答,最终我想出的解决方案是使用Cajo Framework,它提供了一个非常灵活的分发系统,并允许我按照自己的意愿处理注册表。它还可以在NAT、防火墙和HTTP代理后面工作,这非常有用。
我相信rndm.buoy建议的代理方法在某些情况下会起作用,但在某些系统上可能会有麻烦。RMI似乎存在一些与错误网络接口相关的问题,特别是在基于Debian的Linux发行版上运行时我遇到了这个问题。

0

我可能错了,但看起来rmiregistry应用程序本质上是本地命名服务的包装器。这意味着没有办法使其指向远程对象。

您需要的是一个命名实现,并且要集群化。考虑转移到J2EE AS集群解决方案中。JNDI树在集群内共享。


你错了。RMI注册表 就是 一个命名服务。它不是任何东西的包装器。它只是不接受除本地主机以外的绑定/重新绑定/解绑请求。这并不意味着不能指向远程对象。它可以。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接