Fiddler 是目前最強大最好用的 Web 調試工具之一,它能記錄全部客戶端和服務器的http和https請求,容許你監視,設置 CGI 請求的斷點,甚至修改輸入輸出數據。同類的工具還有httpwatch,firebug,wireshark,google審查元素。與這些基於網頁瀏覽器的工具不一樣,fiddler是一個富客戶端桌面工具,不只能監聽瀏覽器對網頁的請求和對瀏覽器的響應(http和https請求),並且能夠監聽其餘程序(好比java桌面應用)的http請求(固然須要額外的設置,在此不贅述)。另外,值得一提的是,即使在瀏覽器的調試中,它也能勝任其餘工具,好比IE瀏覽器,當咱們須要彈出一個模式對話框(modalDialog)時,這些瀏覽器監聽插件就派不上用場了,還得fiddler出場。若是你還不曾據說過這個工具,請先閱讀這篇科普文:《WEB 調試利器:Fiddler 教程》 html
fiddler 和常見的底層抓包(網卡) 工具不同(如 wincap、wireshark),它是在 web server 和 web browser 之間搭了一層 proxy,全部的請求都會通過它,以下圖所示: 前端
fiddler在客戶瀏覽器及web服務器之間充當了一個請求及響應的代理角色,它會在本地創建一個默認代理服務,端口爲8888,爲此咱們訪問一下此端口,可見以下效果: java
第一種:打開Fiddler 點擊Rules-> Automatic Breakpoint ->Before Requests(這種方法會中斷全部的會話)
如何消除命令呢? 點擊Rules-> Automatic Breakpoint ->Disabled
第二種: 在命令行中輸入命令: bpu www.baidu.com (這種方法只會中斷www.baidu.com)
如何消除命令呢? 在命令行中輸入命令 bpu python
第一種:打開Fiddler 點擊Rules-> Automatic Breakpoint ->After Response (這種方法會中斷全部的會話)
如何消除命令呢? 點擊Rules-> Automatic Breakpoint ->Disabled
第二種: 在命令行中輸入命令: bpafter www.baidu.com (這種方法只會中斷www.baidu.com)
如何消除命令呢? 在命令行中輸入命令 bpafter, ios
建立重定向規則,例如將目標請求是這個js的HTTP請求重定向到本地文件 web
請參考阿里 UED 的這篇:使用Fiddler提升前端工做效率 (實例篇) chrome
http://www.aliued.cn/2010/04/25/use-fiddler-to-improve-efficiency-of-front-development-example.html c#
好比你可能在debug某些網頁時,會遇到上百個請求,看的你眼花繚亂,這是你能夠啓用 fiddler 強大的過濾機制,還能夠依據正則來過濾, 瀏覽器
如: REGEX:(empty.js.gif|__utm.gif) , 服務器
具體你能夠參考:
http://fiddler2.com/documentation/KnowledgeBase/Filters,
例如:
http://my.oschina.net/leejun2005/blog/65259
http://vdisk.weibo.com/s/CcitC7ClCn_vr
http://vdisk.weibo.com/s/CcitC7ClCopIM
http://fiddler2.com/blog/blog/2013/07/15/understanding-fiddlerscript
http://fiddler2.com/documentation/KnowledgeBase/Filters
能夠看上圖的藍色方框就是自定義列
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"); }
選擇類:?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
fiddler安裝以後,默認會在IE瀏覽器中安裝一個fiddler的插件,因此它對IE及國內基於IE內核的各種瀏覽器都能實現監聽,但其餘內核的瀏覽器沒法被監聽。
解決辦法:禁用chrome和firefox中具備代理功能的插件,好比個人chrome安裝了switchSharp,禁用它或選擇「使用系統代理設置」,或在switchSharp中新配置一個代理項(好比名爲fiddler,用於指向代理127.0.0.1,端口8888,以下圖),便可實現監聽。
使用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/
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
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 便可。
爲何想來總結一下呢,是由於最近有個測試需求,須要檢測某個網頁指定的 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
(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
(4)Fiddler ScriptSamples
http://fiddlerbook.com/Fiddler/dev/ScriptSamples.asp
(5)fiddlerscript addcolumns
http://docs.telerik.com/fiddler/knowledgebase/fiddlerscript/addcolumns/