我可以编写一个Java加载器类来挂载已加载的类中的HTTP请求吗?

时间:2010-10-11 03:22:47

标签: java hook classloader

我有一个类,我想挂钩和重定向HTTP请求。 我还有一个已经编写的加载器类,但它只是替换了包含我想要更改的HTTP请求的函数。 有没有办法在Java中挂钩HTTP请求,以便我可以更容易地重定向它们? 有点像代理包装器。

澄清: 该应用程序向URL发送GET或POST请求。 我需要内容保持不变,只需更改URL即可。 DNS重定向不起作用,Host HTTP头必须对新服务器正确。

PS:这是桌面应用程序,而不是服务器脚本。

5 个答案:

答案 0 :(得分:2)

这样做的一种繁琐但可靠的方法是让您的应用程序使用代理服务器,然后编写代理服务器来进行所需的更改。代理服务器可以在您的应用程序中进行处理;它不需要是一个单独的程序。

要使用代理,请设置几个system properties - http.proxyHosthttp.proxyPort。然后,通过HttpURLConnection发出的请求将使用该代理(除非它们专门覆盖默认代理设置)。我认为使用Apache HttpClient等其他方法的请求不会受到影响,但希望您的所有请求都使用HttpURLConnection

要实现代理,如果您使用的是Sun JRE,那么您应该使用built-in HTTP server;设置一个映射到路径“/”的单个处理程序,这将获取您的应用程序发送的所有请求,然后可以确定发送它们的正确URL,并建立与该URL的连接(所有权利都是正确的)标题也是)。要建立连接,请使用URL.openConnection(Proxy.NO_PROXY)以避免向代理发出请求,从而陷入无限循环。然后,您需要在两个插座之间抽取输入和输出。

我能想到的另一种方法是使用新的处理程序覆盖HttpURLConnection,该处理程序将请求引导到您想要的目的地;你需要找到一种方法来说服URL类使用你​​的处理程序而不是默认的处理程序。我不知道你怎么这么干净。

答案 1 :(得分:1)

虽然是较旧的帖子,但这应该提供一些可以执行的字节码注入的想法:Java Programming: Bytecode Injection。另一个工具是Javassist,您可以从Aspected-oriented programming wiki文章中找到一些链接(查看字节码编织器部分)。

有些产品会广泛动态修改代码。

根据需要,可能会有......不那么痛苦的方法。如果您只是想“挂钩”HTTP请求,另一个选择就是使用代理(可能是一个外部进程)并通过它进行漏斗。使用代理可能需要控制使用的名称解析。

答案 2 :(得分:1)

您可以使用拦截请求的servlet过滤器,可以从这里进一步包装,重定向,转发或完成请求。

http://www.oracle.com/technetwork/java/filters-137243.html

答案 3 :(得分:0)

你控制所有的代码吗?如果是这样,我建议使用Dependency Injection来注入您想要的具体实现,这将允许您注入代理类。

答案 4 :(得分:0)

  • 如果您可以更改源代码,只需更改它并在每个HTTP请求上添加额外的代码。

  • 如果您无法更改源代码,但它使用依赖注入,也许您可​​以注入一些东西来捕获请求。

  • 否则:使用面向方面的编程并捕获到URL类,或者用于执行HTTP请求的任何内容。 @AspectJ(http://www.eclipse.org/aspectj/doc/next/adk15notebook/ataspectj.html)非常简单而且功能强大。