我正在嘗試創建一個HttpServlet,將所有傳入請求按原樣轉發到另一個運行在不同域上的serlvet。遠程服務器的RequestDispatcher?
這是如何實現的? RequestDispatcher的forward()只能在同一臺服務器上運行。
編輯:我不能引入任何依賴關係。
我正在嘗試創建一個HttpServlet,將所有傳入請求按原樣轉發到另一個運行在不同域上的serlvet。遠程服務器的RequestDispatcher?
這是如何實現的? RequestDispatcher的forward()只能在同一臺服務器上運行。
編輯:我不能引入任何依賴關係。
你不能當它不在同一ServletContext
或相同/羣集web服務器上運行,其中,所述web應用被配置爲共享ServletContext
(Tomcat中的情況下,檢查crossContext
選項)。
您已有發送重定向HttpServletResponse.sendRedirect()
。如果您的實際問題是重新使用新URL上的查詢參數,只需重新發送它們。
response.sendRedirect(newURL + "?" + request.getQueryString());
或者當它是一個POST,發送HTTP 307重定向,客戶端將重新在新的URL相同POST查詢參數。
response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
response.setHeader("Location", newURL);
更新按照該意見,這顯然不是一種選擇,以及因爲要隱藏的URL。在這種情況下,你必須讓servlet玩代理。您可以使用HTTP客戶端完成此操作,例如Java SE提供java.net.URLConnection
(mini tutorial here)或更方便的Apache Commons HttpClient。
如果我們得到,只是做:
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可能對此非常有幫助。
碼頭有一個樣本ProxyServlet實施,使用URL.openConnection()在引擎蓋下。隨意使用原樣或用作您自己實施的靈感。 ;-)
或者您可以使用Apache HttpClient,請參閱tutorial。
正如其他人指出的,你想要的是一個代理。您的選項:
查找這樣做的開源Java庫。這裏有幾個,但我沒有使用過它們,所以我不能推薦任何。
自己寫。不要太難,只要記住處理像傳遞所有標題和響應代碼的東西。
在Apache 2.2中使用代理模塊。這是我選擇的那個,因爲我已經知道它可靠地工作。
好的。如果我不想將目標網址展示給最終用戶,該怎麼辦?沒有什麼像App Engine的URLFetch? http://code.google.com/appengine/docs/python/urlfetch/overview.html – bjornl 2010-10-12 15:30:06
然後,您需要讓servlet充當使用HTTP客戶端的代理。 – BalusC 2010-10-12 15:31:21
謝謝!將檢查Apache的httpclient http://hc.apache.org/httpclient-3.x/ – bjornl 2010-10-12 15:33:01