[英]Java Servlet as a HTTP Proxy
我已經閱讀了數百個SO帖子並研究了幾個可用的Java HTTP代理源...但是我找不到解決問題的方法。
我寫了一個代理Http-Requests的WebApp。 WebApp正在運行,但是鏈接和引用會被破壞,因為代理頁面的“根”指向我的服務器的根,而不是指向我的proxyservlet的路徑。
為了更清楚:
我的ProxyServlet獲取請求“ http://myserver.com/proxy/ProxyServlet?foo=bar ”
ProxyServlet現在從ServerX獲取頁面內容(例如“ http://original.com/test.html ”)
只需從一個流讀取和寫入另一個流並復制標題,即可將頁面內容傳送到瀏覽器。
瀏覽器顯示瀏覽器顯示的頁面,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.