一、工欲善其事必先利其器
做Web開發的人總免不了與Http/Https請求打交道,很多時候我們都希望能夠直觀的的看到我們發送的請求參數和服務器返回的響應信息,這個時候就需要借助於某些工具啦。本文將采用Fiddler2作為分析工具,Fiddler很強大,它能記錄所有客戶端和服務器的http和https請求,允許你監視,設置斷點,甚至修改輸入輸出數據,是越牆抓包之利器。關於工具的介紹可以參考下面的鏈接:
http://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html
工具的界面如下(拷貝了上面鏈接的圖,
):
這里我想說要注意以下幾點:
1、工具的原理實際是啟動的時候為你開啟了一個代理(端口是8888,默認的),關閉的時候會取消這個代理設置。如下圖所示,然后所有的請求都會首先通過這個代理(localhost除外),所以它支持多種瀏覽器。
2、默認情況下是沒有開啟Https請求監聽的,所以得手動開啟,勾選下面的紅色框框里面的東西,注意那段紅色的文字哦
二、瀏覽器請求的監聽方法
經過上面的配置,瀏覽器發送的Internet請求不管是http還是https都可以監聽了。但是有一個例外,就是你自己電腦上的站點(localhost和127.0.0.1)還是監聽不到,因為Fiddler默認忽略來自這兩個地址的請求,解決的方法如下:
1、用 http://localhost. (locahost緊跟一個點號)
2、用 http://127.0.0.1. (127.0.0.1緊跟一個點號)
3、用 http://machinename (機器名)
三、Java后台工程Http和Http請求的監聽方法
1、后台工程的Http請求
在默認情況下,Fiddler不能監聽Java HttpURLConnection請求。究其原因,Java的網絡通信協議棧可能與瀏覽器的通信協議棧略有區別,Fiddler監聽Http請求的原理是在應用程序和操作系統網絡通信層之間搭建了一個代理服務器,而Java的HttpURLConnection應該是繞過了這個代理服務器,因此Fiddler無法監聽到Java HttpURLConnection請求。解決方法就是給java環境設置一個代理指向Fiddler,其方法有兩種:
一是設置JVM的啟動參數,MyApp是你的應用名
java -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888 MyApp
二是設置環境屬性
System.setProperty("http.proxyHost", "localhost"); System.setProperty("http.proxyPort", "8888"); System.setProperty("https.proxyHost", "localhost"); System.setProperty("https.proxyPort", "8888");2、后台工程的Https請求
這個就比較繁瑣了,整了好久才弄明白,最主要的困難就是Https證書問題,相關的知識可以參考下面的鏈接:http://www.cnblogs.com/devinzhang/archive/2012/02/28/2371631.html。
我們知道SDK要發送Https請求就必須先注冊該站點的證書到jre中,注冊的方法如下:
其中keytool位於java jdk的 bin目錄下。
要想監聽后台Https請求,必須要注冊兩個證書,一個是該Https站點的證書,還有一個是Fiddler自己的證書。應該還記得上面第一張截圖那段紅色的文字吧?沒錯,點擊那個按鈕導出證書到桌面。在注冊完成Https站點的證書后,再注冊Fiddler的證書。然后仿照上面的方法注冊證書,下面是我的機器的注冊代碼
C:\Users\Administrator>D:\bingoeclipse4.3win64\jdk\bin\keytool.exe -import -file C:\Users\Administrator\Desktop\FiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler請記得一定要注冊兩個證書,否則會報證書不存在錯誤。
經過以上的證書注冊,我們應該能實現監聽Https請求了,但是還有一個問題,那就是前面多次提到的Fiddler會忽略localhost的請求,所以我們還是要配置一個代理指向Fiddler,在JVM的啟動參數的地方配置如下信息:
我用的是Intell IDEA編輯器,Eclipse只是配置的地方不同而已,個人感覺IDEA比較好用,智能提示很強。
經過以上的配置和注冊處理,現在運行起來應該能監聽Https的請求了,效果圖如下。