Java JVM的HTTP代理设置

时间:2015-02-23 13:41:57

标签: java proxy jvm fiddler intellij-14

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

我在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中打开用户界面,我可以看到从浏览器到应用程序的流量。我没有看到JBOSS对外部服务的任何调用被截获。我认为除了浏览器到JBOSS之外,我还会看到从JBOSS到外部服务的所有调用。

更新

我尝试将这些添加到每个this SO answer的properties-service.xml中 - 没有乐趣。

我正在运行Spring 3,使用Apache HttpClient作为我的Web服务客户端。我将着眼于为它配置代理。

2 个答案:

答案 0 :(得分:3)

感谢bmargulies和其他任何看过这个的人。我有一个解决方案,希望能帮助别人。

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

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

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

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

我第一次尝试时失败了。我花了一段时间才弄清楚Apache Commons HttpConfiguration类没有遵循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服务的调用。快乐!

答案 1 :(得分:1)

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

避免 HttpURLConnection的代码有很多充分的理由,只需通过普通的旧套接字打开TCP连接,即使该代码计划与HTTP通信。 HttpURLConnection具有多种浏览器模拟功能&#39;妨碍了。例如,它已经破坏了CORS并拒绝了一些合法的HTTP动词。

执行此操作并且反过来碰巧执行HTTP的代码可能会选择尊重这些参数,而它可能不会。例如,我有理由相信Apache Commons HTTP库可以为调用者提供一个选择。

如果你把JBoss放在一个调试器中并打破套接字连接原语,我想你会在这方面很快找到你发生的事情。