5

我已经阅读了数百篇 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 的映射更改为“/*”也是不可能的...必须通过此路径访问...)

4

2 回答 2

5

您正在发明“反向代理”,却错过了“URL 重写”功能...在我的搜索结果顶部,这是一个开源代理 servlet:http: //j2ep.sourceforge.net/docs/重写.html

此外,如果您必须这样做,您应该知道系统架构可能有问题。始终可以选择使用 Apache、nginex、Varnish 等独立代理,因为在开始扩展时您必须添加一个(或更多!)。

于 2012-08-28T22:34:33.290 回答
1

听起来您正在代理的页面正在使用绝对链接,例如<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();
于 2013-11-04T22:17:56.110 回答