Java JVM 的 HTTP 代理设置

HTTP Proxy Setup For Java JVM

为 Java JVM 6.x 设置 HTTP 代理对我不起作用;我希望有人能发现我遗漏的东西。

我在 JBOSS 5.1.2 上部署了一个 Java 应用程序,它多次调用外部 Web 服务。我希望能够使用代理拦截这些调用:Fiddler 版本 4.4.8.0。

在执行 SO search 之后,我在启动时将以下标志添加到我的 JBOSS VM 参数中:

-DproxySet=true -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888 -Dhttps.proxyHost=localhost -Dhttps.proxyPort=8888

我在 IntelliJ 14 中 运行 JBOSS。

如果我启动 JBOSS、Fiddler 并在 Chrome 中打开 UI,我可以看到从浏览器到应用程序的流量。我没有看到从 JBOSS 到外部服务的任何调用被拦截。我以为除了从浏览器到 JBOSS.

的调用之外,我还会看到从 JBOSS 到外部服务的所有调用

更新:

我尝试将这些添加到属性中 - service.xml 每个 this SO answer - 不开心。

我是 运行 Spring 3,使用 Apache HttpClient 作为我的 Web 服务客户端。我将研究为它配置代理。

这些参数首先由 HttpURLConnection 读取。当然,它们是特定于 HTTP 的,因此任何其他连接到外部世界的方式都必然会忽略它们。

有很多很好的理由让代码避免 HttpURLConnection 并通过普通的旧套接字打开 TCP 连接,即使该代码计划使用 HTTP。 HttpURLConnection 有几个 'browser emulation features' 妨碍了。例如,它因 CORS 而被破坏并拒绝一些合法的 HTTP 动词。

执行此操作且恰好执行 HTTP 的代码可能会选择遵守这些参数,也可能不会。例如,我有理由相信 Apache Commons HTTP 库会为调用者提供一个选择。

如果您将 JBoss 放入调试器并中断套接字连接原语,我想您会很快发现这方面发生了什么。

感谢 bmargulies 和其他看过这篇文章的人。我有一个解决方案,希望对其他人有所帮助。

向我的 JVM 启动选项添加 -Dhttp.proxyHost 参数没有任何作用。

在我的部署 properties-services.xml 中将这些相同的参数添加到 JBOSS 5.1.2 配置没有任何效果。

我认为使用 Spring 3.x 是解释此行为的一个因素。我不得不告诉 Spring Web 服务客户端使用代理。

我添加了一些 Spring bean 来连接 Fiddler 代理 HttpClient 并将其注入到 Web 服务客户端,替换非代理版本。

第一次尝试失败了。我花了一段时间才弄清楚 Apache Commons HttpConfiguration class 没有遵循 Java bean 标准,所以 Spring 在尝试连接它时崩溃了。我不得不使用 Spring MethodInvokingFactoryBean 来绕过它。

这是相关的 Spring 配置 XML:

<!-- New beans for Fiddler proxy -->
<bean id="fiddlerProxyHost" class="org.apache.commons.httpclient.ProxyHost">
    <constructor-arg name="hostname" value="localhost"/>
    <constructor-arg name="port" value="8888"/>
</bean>

<bean id="fiddlerProxyHostConfiguration" class="org.apache.commons.httpclient.HostConfiguration"/>

<bean id="fiddlerProxyHostSetter" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="fiddlerProxyHostConfiguration"/>
    <property name="targetMethod" value="setProxyHost"/>
    <property name="arguments" ref="fiddlerProxyHost"/>
</bean>

<bean id="fiddlerProxyClient" class="org.apache.commons.httpclient.HttpClient">
    <property name="hostConfiguration" ref="fiddlerProxyHostConfiguration"/>
</bean>

现在我可以在 Fiddler 中看到应用程序对 Web 服务的调用。快乐!