Java Servlet作为HTTP代理

时间:2012-08-22 12:27:47

标签: java servlets proxy http-headers

我已经阅读了数百个SO帖子,并研究了几个可用的Java HTTP代理源...但我无法找到解决问题的方法。

我写了一个代理Http-Requests的WebApp。 WebApp正在运行,但是链接和引用会被破坏,因为代理页面的“Root”指向我的服务器的根目录而不是指向我的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

  5. 是否有响应标题,我可以更改“路径”,以便相对链接正确指向我的ProxyServlet?

    (重写页面内容并替换链接会太困难,因为页面包含相对寻址的元素,例如javascript代码和其他活动内容......)

    (将我的Servlet的映射更改为“/ *”也是不可能的......必须通过此路径访问...)

2 个答案:

答案 0 :(得分:5)

您正在发明一个“反向代理”,并错过了“网址重写”功能...... 在我的搜索结果的顶部,这是一个开源代理servlet,它执行此操作: http://j2ep.sourceforge.net/docs/rewrite.html

如果你不得不这样做,你应该知道系统架构可能有问题。选择像Apache,nginex,Varnish这样的独立代理应该是一个选项,因为在开始扩展时你必须添加一个(或更多!)。

答案 1 :(得分:1)

听起来您正在使用的页面正在使用绝对链接,例如<a href="/XXX.html">表示&#34;无论在何处找到此链接,都要查找相对于文档根目录&#34;。如果你能控制它,那么最好的办法是让代理目标在它的链接中更宽松,而是使用<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();