簡體   English   中英

Java Servlet作為HTTP代理

[英]Java Servlet as a HTTP Proxy

我已經閱讀了數百個SO帖子並研究了幾個可用的Java HTTP代理源...但是我找不到解決問題的方法。

我寫了一個代理Http-Requests的WebApp。 WebApp正在運行,但是鏈接和引用會被破壞,因為代理頁面的“根”指向我的服務器的根,而不是指向我的proxyservlet的路徑。

為了更清楚:

  1. 我的ProxyServlet獲取請求“ http://myserver.com/proxy/ProxyServlet?foo=bar

  2. ProxyServlet現在從ServerX獲取頁面內容(例如“ http://original.com/test.html ”)

  3. 只需從一個流讀取和寫入另一個流並復制標題,即可將頁面內容傳送到瀏覽器。

  4. 瀏覽器顯示瀏覽器顯示的頁面,URL是原始請求(“ http://myserver.com/proxy/ProxyServlet?foo=bar ”),但所有相關鏈接現在指向“ http:// myserver” .com / XXX.html “而不是” http://myserver.com/proxy/ProxyServlet/XXX.html

是否有響應標題,我可以更改“路徑”,以便相對鏈接正確指向我的ProxyServlet?

(重寫頁面內容並替換鏈接會非常困難,因為頁面包含相對尋址的元素,例如javascript代碼和其他活動內容......)

(將我的Servlet的映射更改為“/ *”也是不可能的......必須通過此路徑訪問...)

你正在發明一個“反向代理”,並錯過了“URL重寫”功能......在我的搜索結果的頂部,這是一個開源代理servlet,它執行此操作: http//j2ep.sourceforge.net/docs/ rewrite.html

如果你不得不這樣做,你應該知道系統架構可能有問題。 放棄像Apache,nginex,Varnish這樣的獨立代理應始終是一個選項,因為在開始擴展時你必須添加一個(或更多!)。

聽起來您所代表的頁面使用的是絕對鏈接,例如<a href="/XXX.html">這意味着“無論找到此鏈接的位置,都要查找相對於文檔根目錄的鏈接”。 如果您可以控制它,那么最好的方法是使代理目標在鏈接中更寬松,而是使用<a href="XXX.html"> 如果你不能這樣做,那么你需要使用JSoup重寫這些URL,一些示例代碼:

Document doc = Jsoup.parse(rawBody, getDisplayUrl());

for(Element cssALink : doc.select("link[rel=stylesheet],a[href]"))
{
    cssALink.attr("href", cssALink.absUrl("href"));
}
for(Element imgJsLink : doc.select("script[src],img[src]"))
{
    imgJsLink.attr("src", imgJsLink.absUrl("src"));
}
return doc.toString();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM