18.13 RMI über die Firewall
Bei der Kommunikation der beiden Partner gibt es eine direkte Verbindung über Socket-Objekte. Diesen Sockets wird ein Port zugewiesen, so dass RMI die serialisierten Daten dann über diese zugewiesenen Ports überträgt. Dies macht jedoch Probleme bei einer Firewall, die ein internes Firmennetz schützen möchte und nur genau spezifizierte Ports, Protokolle und Richtungen offen lässt. Soll eine RMI-Lösung für ein abgeschottetes Netz entwickelt werden, stellt sich die Frage nach der einzusetzenden Technik.
18.13.1 RMI über HTTP getunnelt
HTTP dient normalerweise zum Übertragen der Daten von Web-Server und Browser. RMI bietet zum Übertragen der Daten eine Lösung über HTTP an. Ist das Internet-Protokoll installiert, so lässt die Firewall die Anfragen und Antworten der Internet-Partner passieren - üblicherweise auf Port 80. Die RMI-Lösung macht es sich zunutze, dass die Daten in spezielle HTTP-Pakete eingepackt (getunnelt) werden. Dazu nutzt das Tunneling-Protokoll veränderte POST-Kommandos. Die Transportschicht des Clients generiert dann eine POST-Anfrage, wobei hier zwei unterschiedliche Verfahren zum Einsatz kommen.
|
Der Sender schickt direkt die Anfrage an den RMI-Server, der an dem Port horcht. Dieser nimmt dann aus dem POST-Paket die Daten heraus und interpretiert sie. Das wäre eine Lösung, wenn es hinter dem Sender eine Firewall gibt, aber nicht vor dem Empfänger. In dem Fall, in dem Sender und Empfänger geschützt sind, hilft ein zweites Verfahren. |
|
Der Transportmechanismus arbeitet vollständig über HTTP-Anweisungen. Dann antwortet auf der Server-Seite der Web-Server, der die Anfragen weiterleiten muss. Dazu dient ein CGI-Skript, welches die Daten wiederum zum RMI-Server hoch reicht. |
Auf diese Weise werden die Objekte übertragen, allerdings mit einer Verzögerung durch das zusätzliche Verpacken und dem eventuellen Aufruf des CGI-Skripts.
Das Schöne bei der Lösung ist, dass der Client dies gar nicht mitbekommt und nicht besonders konfiguriert werden muss. Soll das Verfahren ausdrücklich verboten werden, ist die Eigenschaft java.rmi.server.disableHttp auf true zu setzen.
Unter http://developer.java.sun.com/developer/onlineTraining/rmi/RMI.html findet sich von Sun eine nette Zusammenfassung (mit Aufgaben) zu RMI.
|