1. 程式人生 > 其它 >關於 WEB/HTTP 除錯利器 Fiddler 的一些技巧分享

關於 WEB/HTTP 除錯利器 Fiddler 的一些技巧分享

1、原理簡介:

Fiddler 是目前最強大最好用的 Web 除錯工具之一,它能記錄所有客戶端和伺服器的http和https請求,允許你監視,設定 CGI 請求的斷點,甚至修改輸入輸出資料。同類的工具還有httpwatch,firebug,wireshark,google審查元素。與這些基於網頁瀏覽器的工具不同,fiddler是一個富客戶端桌面工具,不僅能監聽瀏覽器對網頁的請求和對瀏覽器的響應(http和https請求),而且可以監聽其他程式(比如java桌面應用)的http請求(當然需要額外的設定,在此不贅述)。另外,值得一提的是,即便在瀏覽器的除錯中,它也能勝任其他工具,比如IE瀏覽器,當我們需要彈出一個模式對話方塊(modalDialog)時,這些瀏覽器監聽外掛就派不上用場了,還得fiddler出場。如果你還未曾聽說過這個工具,請先閱讀這篇科普文:

《WEB 除錯利器:Fiddler 教程》

fiddler 和常見的底層抓包(網絡卡) 工具不一樣(如 wincap、wireshark),它是在 web server 和 web browser 之間搭了一層 proxy,所有的請求都會經過它,如下圖所示:

    fiddler在客戶瀏覽器及web伺服器之間充當了一個請求及響應的代理角色,它會在本地建立一個預設代理服務,埠為8888,為此我們訪問一下此埠,可見如下效果:

2、一些常用技巧介紹:

(1)Fiddler中設定斷點修改Request

第一種:開啟Fiddler 點選Rules-> Automatic Breakpoint  ->Before Requests(這種方法會中斷所有的會話) 如何消除命令呢?  點選Rules-> Automatic Breakpoint  ->Disabled 第二種:  在命令列中輸入命令:  bpu www.baidu.com   (這種方法只會中斷www.baidu.com) 如何消除命令呢?  在命令列中輸入命令 bpu

(2)Fiddler中設定斷點修改Response

第一種:開啟Fiddler 點選Rules-> Automatic Breakpoint  ->After Response  (這種方法會中斷所有的會話) 如何消除命令呢?  點選Rules-> Automatic Breakpoint  ->Disabled 第二種:  在命令列中輸入命令:  bpafter www.baidu.com   (這種方法只會中斷www.baidu.com) 如何消除命令呢?  在命令列中輸入命令 bpafter,

(3)自動重定向 AutoResponder 到本地檔案

建立重定向規則,例如將目標請求是這個js的HTTP請求重定向到本地檔案

請參考阿里 UED 的這篇:使用Fiddler提高前端工作效率 (例項篇)

http://www.aliued.cn/2010/04/25/use-fiddler-to-improve-efficiency-of-front-development-example.html

(4)過濾會話 session list filter:

比如你可能在debug某些網頁時,會遇到上百個請求,看的你眼花繚亂,這是你可以啟用 fiddler 強大的過濾機制,還可以依據正則來過濾,

如: REGEX:(empty.js.gif|__utm.gif) ,

具體你可以參考:

http://fiddler2.com/documentation/KnowledgeBase/Filters

例如:

(5)請求構建器(Request Builder)、對兩個資料流進行比較

(6)文字編碼和解碼:開啟Tools -> Text Encode/Decode

(7)模擬user-agent:Rules->Customize Rules、模擬慢速網路

(8)fiddler 列印 cgi log:

http://my.oschina.net/leejun2005/blog/65259

(9)fiddler-使用技巧:

http://vdisk.weibo.com/s/CcitC7ClCn_vr

http://vdisk.weibo.com/s/CcitC7ClCopIM

(10)FiddlerScript:

http://fiddler2.com/blog/blog/2013/07/15/understanding-fiddlerscript

(11)Filters Reference:

http://fiddler2.com/documentation/KnowledgeBase/Filters

(12)自定義列:Add Columns to the Web Sessions List:

          可以看上圖的藍色方框就是自定義列

http://fiddler2.com/documentation/KnowledgeBase/FiddlerScript/AddColumns

舉個栗子:

         在 rule規則指令碼的 static function Main() 函式中新增 3 列:遠端ip、referer、ReturnedCookie

// The Main() function runs everytime your FiddlerScript compiles
static function Main() {
    var today: Date = new Date();
    FiddlerObject.StatusText = " CustomRules.js was loaded at: " + today;

    FiddlerObject.UI.lvSessions.AddBoundColumn("remoteIP", 200, "X-HOSTIP");
    FiddlerObject.UI.lvSessions.AddBoundColumn("Referer", 200, "@request.Referer");
    FiddlerObject.UI.lvSessions.AddBoundColumn("ReturnedCookie", 200, "@response.Set-Cookie");
    
    // Uncomment to add a "Server" column containing the response "Server" header, if present
    // UI.lvSessions.AddBoundColumn("Server", 50, "@response.server");

    // Uncomment to add a global hotkey (Win+G) that invokes the ExecAction method below...
    // UI.RegisterCustomHotkey(HotkeyModifiers.Windows, Keys.G, "screenshot"); 
}

(13)常用fiddler命令:

選擇類:?text、>size、<size、=status、@host、 blod text、select、allbut、keeponly 斷點類:bpafter、bps、bpv、bpm、bpu 控制類:hide、start、stop、show、quit

其他:cls/clear、dump、g/go、help、urlreplace

例如:?text 高亮選中會話後,shift + delete 即可反選刪除,這樣就過濾除了你要的 session 請求。

http://fiddler2.com/documentation/KnowledgeBase/QuickExec

3、注意的問題及解決方法

(1)chrome和firefox瀏覽器無法被監聽

fiddler安裝之後,預設會在IE瀏覽器中安裝一個fiddler的外掛,所以它對IE及國內基於IE核心的各類瀏覽器都能實現監聽,但其他核心的瀏覽器無法被監聽。 解決辦法:禁用chrome和firefox中具有代理功能的外掛,比如我的chrome安裝了switchSharp,禁用它或選擇“使用系統代理設定”,或在switchSharp中新配置一個代理項(比如名為fiddler,用於指向代理127.0.0.1,埠8888,如下圖),即可實現監聽。

(2)無法代理本地web伺服器的訪問請求

使用fiddler的時候,我們更多的是基於本地程式的除錯,可惜fiddler捕捉不了本地(localhost或127.0.0.1)的http請求。難道fiddler就束手無策了嗎?當然不是。 一般我們訪問安裝在本地的伺服器程式時,使用的localhost或127.0.0.1,預設會繞過代理,直接訪問目標伺服器,通過fiddler特有的請求方式,可以使本地請求及響應都被fiddler攔截。

方法一:在localhost後增加.fiddler 比如請求http://localhost:8080改為http://localhost.fiddler:8080即可 方法二:更簡單,在localhost或127.0.0.1後增加一個點即可 比如http://localhost.:8080

具體請參考:http://www.ichatter.cn/2013/06/19/666/

(3)Fiddler不能監聽Java HttpURLConnection請求,請看:

http://www.cnblogs.com/tt-0411/archive/2012/03/18/2404355.html

http://stackoverflow.com/questions/8549749/how-to-capture-https-with-fiddler-in-java

(4)Fiddler 不能監聽、捕獲 python urllib2 proxy、ProxyHandler 的問題:

In Fiddler2, go to the page Tools->Fiddler Options ...->Connections, remove the trailing semicolon from the value in the "IE should bypass Fiddler for ..." field and restart Fiddler2.

http://stackoverflow.com/questions/7681305/fiddler-does-not-capture-my-scripts-requests

也就是說,去掉 <-loopback> 後面的那個分號,儲存然後重啟你的 fiddler 即可。

4、其它

為什麼想來總結一下呢,是因為最近有個測試需求,需要檢測某個網頁指定的 url 請求個數,Fiddler 雖然可以,但是需要人工進行,想了想準備用 JPCAP 然後封裝個瀏覽器核心試試,做成一個自動化的工具。

JPCAP 簡介:

       眾所周知,JAVA語言雖然在TCP/UDP傳輸方面給予了良好的定義,但對於網路層以下的控制,卻是無能為力的。JPCAP擴充套件包彌補了這一點。   JPCAP實際上並非一個真正去實現對資料鏈路層的控制,而是一箇中間件,JPCAP呼叫wincap/libpcap,而給JAVA語言提供一個公共的介面,從而實現了平臺無關性。在官方網站上宣告,JPCAP支援FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系統。JPCAP的整個結構大體上跟wincap/libpcap是很相像的,例如NetworkInterface類對應wincap的typedef struct _ADAPTERADAPTER,getDeviceList()對應pcap_findalldevs()等等。 使用 JPCAP 實現監聽利用的是所謂的“ARP欺騙”技術。具體請參考:

http://fulong258.blog.163.com/blog/static/17895044200801145924745/

最後談談Java裡面連線作業系統網路協議棧的API。

下表顯示了網路層標準的開放系統互連(OSI)模型

#

協議

Java SDK的核心APIs

7.

應用層

HTTP、FTP、SSL等

java.net.HttpURLConnection、javax.servlet.HttpServlet

6.

表示層

# 在Java裡,OSI應用層和表示層沒有真正區別

5.

會話層

NetBios、RCP

# Java SDK核心對OSI會話層沒有支援

4.

傳輸層

TCP、UDP

java.net.Socket、java.net.ServerSocket、java.net.Datagram

3.

網路層

IP

Java.net.InetAddress

2.

資料鏈路層

PPP

# Java SDK核心對OSI資料鏈路層沒有支援

1.

物理層

乙太網、InfiniBand

# Java SDK核心對OSI物理層沒有支援不過……現在有了Java 7 SDP(VM連線InfiniBand和java.net.*、java.io.*核心APIs的橋樑)

Java 7 SDP:Java套接字直接協議——直接訪問OSI第一層物理層,請參考:

http://www.infoq.com/cn/articles/Java-7-Sockets-Direct-Protocol

5、推薦閱讀:

(1)基於fiddler來模擬限速

http://blogread.cn/it/article/4540?f=wb

(2)Fiddler (二) Script 用法

http://www.cnblogs.com/tankxiao/archive/2012/04/25/2349049.html

(3)Fiddler的高階用法-Fiddler Script

http://cube.qq.com/?p=973

(4)Fiddler ScriptSamples

http://fiddlerbook.com/Fiddler/dev/ScriptSamples.asp

(5)fiddlerscript addcolumns

http://docs.telerik.com/fiddler/knowledgebase/fiddlerscript/addcolumns/