繁体   English   中英

仅限本地主机的RMI?

[英]Localhost-only RMI?

我有一个启动第二个JVM的项目。 目前我正在使用RMI在两者之间进行通信。 在我自己的机器上运行良好。

我需要能够在Windows 7计算机上部署此项目,我无权更改防火墙规则。

注册表(从高任意端口上的第一个JVM内启动)被阻止在这些计算机上打开服务器套接字。

有没有办法限制RMI只听本地连接; 这样Windows防火墙会很酷吗?

或者,是否有一个很好的替代IPC方法,几乎​​不需要功能改变?

干杯。

这比起初看起来更棘手。 需要的是限制注册表正在侦听的IP 地址 ,而不是端口。 问题是RMI注册实现程序( rmiregistry )实际上并没有提供任何机制来限制它监听的IP地址; 它始终监听每个可用的网络接口。 限制这种情况只有两种实用机制:

  1. 使用防火墙规则。 这是正常的技术,但它需要在部署期间进行配置。
  2. 使用特殊版本的RMI注册表将限制应用于正确的IP地址(即localhost127.0.0.1 ),因为Windows 不会抱怨只能从本地计算机访问的套接字。

第二个选项是我要草拟的。 这实际上非常简单,因为您可以将大部分复杂性委托给现有的类。

import java.io.IOException;
import java.net.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;

public class RestrictedRMIRegistry implements RMIServerSocketFactory {
    public static void main(String... args) throws IOException {
        int port = (args.length == 0 ? 1099 : Integer.parseInt(args[0], 10));
        RMIClientSocketFactory csf = RMISocketFactory.getDefaultSocketFactory();
        RMIServerSocketFactory ssf = new RestrictedRMIRegistry();

        LocateRegistry.createRegistry(port, csf, ssf);
    }

    public ServerSocket createServerSocket(int port) throws IOException {
        // Tricky bit; make a server socket with bound address
        return new ServerSocket(port, 0, InetAddress.getLocalHost());
    }
}

这和正常之间的唯一区别rmiregistry实现是一个使用默认设置客户端和服务器套接字工厂。

好的替代方案称为HTTP上的Web服务,通​​常为出站连接打开。

问题在于入站连接。 我相信“正确”的架构是当防火墙后面部署的进程通过第三个进程相互通信时 - 服务器安装在不限制入站HTTP连接的地方。 因此,防火墙后面的2个组件仅执行到服务器的出站HTTP连接。

尝试在启动注册表(或您的方案中涉及的任何其他Java进程)时将java.rmi.server.hostname属性设置为127.0.0.1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM