2010-10-12 4 views
12

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

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

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

ответ

18

Вы не можете, когда он не работает в том же ServletContext или же/кластерным веб-сервер, в котором WebApps настроены поделиться 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); 

Update согласно комментариям, это явно не вариант, а так как вы хотите, чтобы скрыть URL. В этом случае вы должны позволить сервлету играть за прокси. Вы можете сделать это с помощью HTTP-клиента, например. Java SE предоставил java.net.URLConnection (mini tutorial here) или более удобный 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 может быть очень полезным в этом.

+0

ОК.Что делать, если я не хочу показывать целевой URL конечным пользователям? Ничего похожего на URL-адрес App Engine? http://code.google.com/appengine/docs/python/urlfetch/overview.html – bjornl

+1

Затем вам нужно разрешить сервлет действовать как прокси-сервер, используя HTTP-клиент. – BalusC

+0

Спасибо! Будет проверять HTTP-клиент Apache http://hc.apache.org/httpclient-3.x/ – bjornl

2

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

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

2

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

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

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

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

Смежные вопросы