为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服务客户端。我将着眼于为它配置代理。
答案 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放在一个调试器中并打破套接字连接原语,我想你会在这方面很快找到你发生的事情。