RequestDispatcher для удаленного сервера? - PullRequest
12 голосов
/ 12 октября 2010

Я пытаюсь создать HttpServlet, который перенаправляет все входящие запросы как есть, другому сервлету, работающему в другом домене.

Как это можно сделать? Forward () RequestDispatcher работает только на том же сервере.

Редактировать: я не могу представить никаких зависимостей.

Ответы [ 3 ]

21 голосов
/ 12 октября 2010

Вы не можете, когда он не работает на том же ServletContext или том же / кластерном веб-сервере, где веб-приложения настроены для совместного использования ServletContext (в случае Tomcat, отметьте опцию crossContext).

У вас есть для отправки перенаправления на HttpServletResponse.sendRedirect(). Если ваша фактическая проблема заключается в повторном использовании параметров запроса для нового URL, просто отправьте их снова.

response.sendRedirect(newURL + "?" + request.getQueryString());

Или, если это POST, отправьте перенаправление HTTP 307 , клиент повторно применит те же параметры запроса POST к новому URL.

response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
response.setHeader("Location", newURL);

Обновление в соответствии с комментариями, это явно не вариант, так как вы хотите скрыть URL. В этом случае вы должны позволить сервлету играть за прокси. Вы можете сделать это с помощью HTTP-клиента, например, Java SE предоставляет java.net.URLConnection ( мини-учебник здесь ) или более удобный Apache Commons HttpClient .

Если это GET, просто сделайте:

InputStream input = new URL(newURL + "?" + request.getQueryString()).openStream();
OutputStream output = response.getOutputStream();
// Copy.

Или, если это ПОСТ:

URLConnection connection = new URL(newURL).openConnection();
connection.setDoOutput(true);
// Set and/or copy request headers here based on current request?

InputStream input1 = request.getInputStream();
OutputStream output1 = connection.getOutputStream();
// Copy.

InputStream input2 = connection.getInputStream();
OutputStream output2 = response.getOutputStream();
// Copy.

Обратите внимание, что вам, возможно, потребуется захватить / заменить / обновить относительные ссылки в ответе HTML, если таковые имеются. Jsoup может быть чрезвычайно полезен в этом.

3 голосов
/ 13 октября 2010

Как уже отмечали другие, вам нужен прокси. Ваши варианты:

  1. Найдите библиотеку Java с открытым исходным кодом, которая делает это. Там есть несколько, но я не использовал ни одного из них, поэтому я не могу рекомендовать ни одного.

  2. Напиши сам. Не должно быть слишком сложно, просто не забудьте разобраться с такими вещами, как передача всех заголовков и кодов ответов.

  3. Используйте прокси-модуль в Apache 2.2. Это тот, который я выберу, потому что я уже знаю, что он работает надежно.

2 голосов
/ 12 октября 2010

Jetty имеет пример реализации ProxyServlet , который использует URL.openConnection () под капотом.Не стесняйтесь использовать как есть или использовать как вдохновение для своей собственной реализации.; -)

Или вы можете использовать Apache HttpClient , см. Учебник .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...