我需要一个RMI注册表,可以从我的机器外部访问该服务,同时仍然能够根据客户端的IP拒绝连接。以下代码使注册表只能从我的机器访问,但永远不会进入“RMIClientSocketFactory”代码:
LocateRegistry.createRegistry(uri.getPort(), new RMIClientSocketFactory() {
@Override
public Socket createSocket(String host, int port) throws IOException {
System.out.println("RMIServerSocketFactory().createSocket()");
InetAddress addr = InetAddress.getByName(host);
if (addr.equals(InetAddress.getLocalHost())) {
return new Socket(addr, port);
} else {
throw new IOException("remote socket bind forbidden.");
}
}
}, new RMIServerSocketFactory() {
@Override
public ServerSocket createServerSocket(int port) throws IOException {
System.out.println("RMIServerSocketFactory().createServerSocket()");
return new ServerSocket(port, 0, InetAddress.getByName("127.0.0.1"));
}
});
因此它运行“RMIServerSocketFactory”并绑定环回,但从不验证客户端IP。 欢迎任何帮助,非常感谢!
答案 0 :(得分:2)
客户端套接字工厂不是您需要的。
您需要的是ServerSocket
拒绝来自不受欢迎的IP的连接。实现此目的的最简单方法是创建ServerSocket
的子类,该子类重写accept()
方法以立即关闭来自不需要的IP的连接并抛出异常。
然而,有更好的,低级别的方法来控制网络访问,我不认为你的应用程序加倍作为防火墙(这基本上是你需要的)是一个特别好的主意。