2010-10-12 106 views
12

我正在嘗試創建一個HttpServlet,將所有傳入請求按原樣轉發到另一個運行在不同域上的serlvet。遠程服務器的RequestDispatcher?

這是如何實現的? RequestDispatcher的forward()只能在同一臺服務器上運行。

編輯:我不能引入任何依賴關係。

回答

18

你不能當它不在同一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.URLConnectionmini 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可能對此非常有幫助。

+0

好的。如果我不想將目標網址展示給最終用戶,該怎麼辦?沒有什麼像App Engine的URLFetch? http://code.google.com/appengine/docs/python/urlfetch/overview.html – bjornl 2010-10-12 15:30:06

+1

然後,您需要讓servlet充當使用HTTP客戶端的代理。 – BalusC 2010-10-12 15:31:21

+0

謝謝!將檢查Apache的httpclient http://hc.apache.org/httpclient-3.x/ – bjornl 2010-10-12 15:33:01

2

正如其他人指出的,你想要的是一個代理。您的選項:

  1. 查找這樣做的開源Java庫。這裏有幾個,但我沒有使用過它們,所以我不能推薦任何。

  2. 自己寫。不要太難,只要記住處理像傳遞所有標題和響應代碼的東西。

  3. 在Apache 2.2中使用代理模塊。這是我選擇的那個,因爲我已經知道它可靠地工作。