Подтвердить что ты не робот

RequestDispatcher для удаленного сервера?

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

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

Изменить: я не могу вводить какие-либо зависимости.

4b9b3361

Ответ 1

Вы не можете, если он не запускается на том же 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.

Или если это POST:

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 может быть очень полезным в этом.

Ответ 2

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

Или вы можете использовать Apache HttpClient, см. tutorial.

Ответ 3

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

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

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

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