2015-02-23 333 views
0

爲Java JVM 6.x設置HTTP代理不適用於我;我希望有人能夠發現我錯過的東西。針對Java JVM的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運行JBoss 14

我可以看到從瀏覽器到交通應用程序,如果我啓動JBOSS,Fiddler,並在Chrome中打開UI。我沒有看到任何來自JBOSS的電話被攔截到外部服務。我想除了瀏覽器到JBOSS之外,我還會看到從JBOSS到外部服務的所有調用。

更新:

我想每this SO answer添加這些以性能-service.xml的 - 沒有喜悅。

我正在運行Spring 3,使用Apache HttpClient作爲我的Web服務客戶端。我將着眼於配置代理服務器。

+0

我會做出答案,除非我懷疑你不知道它,所以我猜測我錯過了一些東西。 – bmargulies 2015-02-23 13:48:01

+0

你給我太多的信用。我不知道。也許這是我需要更多考慮的事情。 – duffymo 2015-02-23 13:49:22

回答

3

感謝bmargulies和其他任何看着這個的人。我有一個解決方案,我希望能幫助別人。

-Dhttp.proxyHost參數添加到我的JVM啓動選項中什麼也沒做。

在我的部署properties-services.xml中將這些相同的參數添加到JBOSS 5.1.2配置中什麼也沒做。

我相信使用Spring 3.x是解釋這種行爲的一個因素。我必須告訴Spring Web服務客戶端使用代理。

我添加了一些Spring bean,以在提琴手代理HttpClient中連線,並將其注入到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> 

現在我可以看到從應用程序到提琴手Web服務的調用。喜悅!

1

這些參數,首先是HttpURLConnection。當然,它們專用於HTTP,因此任何其他連接外部世界的手段都必然會忽略它們。

代碼到避免HttpURLConnection有很多很好的理由,只要通過普通的舊套接字打開TCP連接,即使該代碼計劃談論HTTP。 HttpURLConnection有幾個'瀏覽器仿真功能',阻礙。例如,CORS被破壞並拒絕一些合法的HTTP動詞。

這樣做並反過來發生HTTP的代碼可能會選擇尊重這些參數,它可能不會。例如,我確信Apache Commons HTTP庫爲調用者提供了一個選擇。

如果你把JBoss放在一個調試器中,並且斷開套接字連接原語,我想你會發現在這方面發生了什麼很快。