如何使用Tomcat隧道传输RMI

时间:2009-07-16 12:50:31

标签: java http tomcat rmi firewall

我想设置RMI在java servlet上通过端口80 ..(通过防火墙) 我有一个Tomcat服务器,我正在寻找将捕获RMI http请求并将其传递到服务器计算机上的RMI层的模块。 我已经读过RMI会自动处理这个问题。

是否有逐步指导?或者只是要在服务器上安装的war文件?

感谢。

1 个答案:

答案 0 :(得分:3)

我们已经在生产服务器上完成了这项工作,但很久以前。没有安装war文件,因为这是一件非常不寻常的事情,尤其是现在使用AJAX和支持Web的应用程序以及什么不是。出于可扩展性和可靠性的原因,我不建议在Internet上部署RMI。它在LAN甚至JVM中都很棒,但在更大范围内我会考虑使用更传统的Web服务。

除此之外,还有一个so-so guide here。它适用于Tomcat 3,但概念仍然相同,它提到了与Apache的集成,这对于Servlet的使用来说是非常多余的,所以如果你已经非常 au fait ,你可以忽略它的大块与Tomcat。

它将指导您在Tomcat中安装servlet,它将解压缩在HTTP Post上捎带的RMI请求,找到本地注册表并为您完成远程方法调用。它还提供了一个小型演示服务器和客户端应用程序来测试你的设置。


根据评论进行修改:

  

我发现了一个模仿/cgi-bin/java-rmi.cgi的servlet,但要使用它我必须将所有请求定向到/ RMIServlet,而不要让客户端知道它被重定向。我搜索了很多,并尝试了很多解决方案。一切都没有成功。最好的方法是什么?

我认为这是通过向RMI提供一个SocketFactory来完成的,它放弃了通常的端口1099路由,而是在HTTP / Post上捎带请求。

套接字工厂本身就是这样的:只需更改URL对象,就可以使用HTTPS。

public class RMIHttpToCgiSocketFactory extends RMISocketFactory implements Serializable {
    public static final long serialVersionUID = 1L;

    public RMIHttpToCgiSocketFactory(){}

    public Socket createSocket( String s, int i ) throws IOException {
        // Whacked out indentation for StackOverflow! Hope you can read this.
        return new HttpsSendSocket( 
            s, 
            i,
            new URL(
                "http", 
                s, 
                "/cgi-bin/java-rmi.cgi?forward="+i
            )
        );
    }

    public ServerSocket createServerSocket( int i ) {
        return null;
    }
}

现在您只需告诉您的应用程序在其RMI交易中使用此套接字工厂。在我们的代码库中,这是在服务器和客户端上完成的。在服务器端,当您的RMI服务绑定到注册表时,您可以在导出对象时指定客户端套接字工厂以获取远程存根。

RMIClientSocketFactory clientSocketFactory = new RMIHttpToCgiSocketFactory();
Remote stub = UnicastRemoteObject.exportObject( 
    server, 
    port, 
    clientSocketFactory, 
    RMISocketFactory.getDefaultSocketFactory() 
);

在客户端上,您可以在找到注册表时指定套接字工厂。

Registry registry = LocateRegistry.getRegistry(
    loginHostName, 
    portNumber, 
    new RMIHttpToCgiSocketFactory()
);