Как мне туннелировать RMI, используя Tomcat? - PullRequest
2 голосов
/ 16 июля 2009

Я бы хотел настроить RMI для прохождения через порт 80 на сервлете Java. (Для прохождения через брандмауэр) У меня есть сервер Tomcat, и я ищу модуль, который будет перехватывать HTTP-запрос RMI и передавать его на уровень RMI на сервере. Я читал, что RMI автоматически обрабатывает это на своей стороне.

Есть ли пошаговое руководство к этому? Или просто файл war для установки на сервер?

Спасибо.

1 Ответ

3 голосов
/ 17 июля 2009

Мы сделали это на рабочем сервере, но это было давно.Военного файла для установки нет, так как это довольно необычная вещь, особенно в наши дни с AJAX и веб-приложениями, а что нет.Я бы не рекомендовал развертывать RMI через Интернет из-за масштабируемости и надежности.Это замечательно для ЛВС или даже для JVM, но в более широком масштабе я бы рассмотрел более традиционный веб-сервис, если это возможно.

Помимо этого, здесь есть так себе руководство .Это для Tomcat 3, но концепции все те же, и в нем упоминается интеграция с Apache, которая довольно избыточна для использования сервлетом, так что есть куски этого, которые вы можете игнорировать, если вы уже достаточно au fait сTomcat.

Он проведет вас через установку сервлета в Tomcat, который распакует запрос RMI, поддерживающий отправку HTTP-сообщения, найдет локальный реестр и завершит удаленный вызов метода для вас.Он также предоставляет небольшой демонстрационный сервер и клиентское приложение для тестирования вашей установки.


Изменить в ответ на комментарии:

У меня естьнашел сервлет, который будет имитировать /cgi-bin/java-rmi.cgi, но чтобы использовать его, я должен перенаправить все запросы в / RMIServlet, не давая клиенту знать, что он перенаправляется.Я много гуглил за это и пробовал многочисленные решения.Все без успеха.Каков наилучший способ сделать это?

Я думаю, что это достигается путем предоставления SocketFactory для RMI, которая отказывается от обычного маршрута порта 1099 и вместо этого выполняет запрос на HTTP / Post.

Сама фабрика сокетов выглядит примерно так: вы можете заставить ее работать с HTTPS, просто изменив объект URL.

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 привязывает себя к реестру, вы можете указать фабрику сокетов клиента при экспорте объекта для получения заглушки Remote.

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

А на клиенте вы можете указать фабрику сокетовпри поиске реестра.

Registry registry = LocateRegistry.getRegistry(
    loginHostName, 
    portNumber, 
    new RMIHttpToCgiSocketFactory()
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...