коммуникация между удаленными сервлетами

У меня есть два веб-приложения, говорят App1 и App2. Я хочу назвать сервлет, который находится в App2 от сервлета в App1. Я использую URLConnection для этого. Я могу передать параметры сервлету в App2 также, и я также могу получить ответ от сервлета как строка. Но я хочу отправить объекты Java от сервлета в App2 и получить их в сервлете App1. Как достигнуть этого?

7
задан BalusC 14 June 2010 в 11:35
поделиться

2 ответа

Используйте Сериализацию

Вместо отправки HTML вы будете отправлять потоки объектов.

Просто имейте в виду, чтобы добавить дополнительную безопасность, вы не хотите, чтобы какой-то внешний источник вставлял зараженные объекты в ваши вызовы.

1
ответ дан 6 December 2019 в 23:01
поделиться

Зависит.


Если эти веб-приложения работают на физически одном и том же веб-сервере в одном и том же servletcontainer, то просто установите его как атрибут запроса и передайте запрос другому контексту:

request.setAttribute("name", object);
ServletContext app2 = getServletContext().getContext("app2");
app2.getRequestDispacher("servletUrl").forward(request, response);

Другой контекст сможет получить объект следующим образом:

Object object = request.getAttribute("name");

Это требует только настройки сервера, чтобы контексты были доступны друг другу. Как это сделать, зависит от servletcontainer. Например, в Tomcat достаточно установить crossContext атрибут элемента webapp в true.

<Context crossContext="true">

Тогда он будет доступен для других контекстов. Для других серверов обратитесь к документации.


Если эти веб-приложения работают на физически другом веб-сервере, то есть несколько вариантов:

  1. Преобразовать в String и отправить как параметр. При получении преобразуйте обратно в строку. Хорошим форматом для этого является JSON. Google Gson предлагает возможности преобразования между полноценными Java-объектами и JSON и наоборот. Если вы используете GET и URI запроса становится довольно длинным, более 2 КБ, то подумайте об использовании POST вместо GET, иначе URI может быть усечен сервером. Плюсы: лучший сервис с возможностью повторного использования. Минусы: трудно отправлять двоичные данные.

    См. также: Преобразование JSON в Java.

  2. Отправьте multipart/form-data HTTP POST запрос, используя URLConnection или Apache HttpComponents Client согласно RFC2388 и обработайте его на другой стороне, используя Apache Commons FileUpload. Плюсы: стандартная спецификация, возможность отправки двоичных данных. Минусы: больше кода.

    См. также: Как использовать URLConnection.

  3. Сериализация объекта Java, запись его в сыром виде в URLConnection#getOutputStream() с помощью ObjectOutputStream и получение его в сыром виде из HttpServletRequest#getInputStream() и отсериализация с помощью ObjectInputStream. Плюсы: простота. Минусы: невозможность повторного использования, жесткая связь.

    См. также: Объектные потоки и Урок: Сериализация.

10
ответ дан 6 December 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: