我想设置RMI在java servlet上通过端口80 ..(通过防火墙) 我有一个Tomcat服务器,我正在寻找将捕获RMI http请求并将其传递到服务器计算机上的RMI层的模块。 我已经读过RMI会自动处理这个问题。
是否有逐步指导?或者只是要在服务器上安装的war文件?
感谢。
答案 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()
);