天天看點

關于 WEB/HTTP 調試利器 Fiddler 的一些技巧分享

來源:https://my.oschina.net/leejun2005/blog/151103

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

關于 WEB/HTTP 調試利器 Fiddler 的一些技巧分享

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

關于 WEB/HTTP 調試利器 Fiddler 的一些技巧分享

第一種:打開fiddler 點選rules-> automatic breakpoint  ->before requests(這種方法會中斷所有的會話)

如何消除指令呢?  點選rules-> automatic breakpoint  ->disabled

第二種:  在指令行中輸入指令:  bpu www.baidu.com   (這種方法隻會中斷www.baidu.com)

如何消除指令呢?  在指令行中輸入指令 bpu

第一種:打開fiddler 點選rules-> automatic breakpoint  ->after response  (這種方法會中斷所有的會話)

第二種:  在指令行中輸入指令:  bpafter www.baidu.com   (這種方法隻會中斷www.baidu.com)

如何消除指令呢?  在指令行中輸入指令 bpafter,

建立重定向規則,例如将目标請求是這個js的http請求重定向到本地檔案

請參考阿裡 ued 的這篇:使用fiddler提高前端工作效率 (執行個體篇)

<a target="_blank" href="http://www.aliued.cn/2010/04/25/use-fiddler-to-improve-efficiency-of-front-development-example.html">http://www.aliued.cn/2010/04/25/use-fiddler-to-improve-efficiency-of-front-development-example.html</a>

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

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

具體你可以參考:

例如:

關于 WEB/HTTP 調試利器 Fiddler 的一些技巧分享

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

         舉個栗子:

         在 rule規則腳本的 static function main() 函數中添加 3 列:遠端ip、referer、returnedcookie

(13)常用fiddler指令:

選擇類:?text、&gt;size、&lt;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 請求。

<a target="_blank" href="http://fiddler2.com/documentation/knowledgebase/quickexec">http://fiddler2.com/documentation/knowledgebase/quickexec</a>

fiddler安裝之後,預設會在ie浏覽器中安裝一個fiddler的插件,是以它對ie及國内基于ie核心的各類浏覽器都能實作監聽,但其他核心的浏覽器無法被監聽。 

解決辦法:禁用chrome和firefox中具有代理功能的插件,比如我的chrome安裝了switchsharp,禁用它或選擇“使用系統代理設定”,或在switchsharp中新配置一個代理項(比如名為fiddler,用于指向代理127.0.0.1,端口8888,如下圖),即可實作監聽。

關于 WEB/HTTP 調試利器 Fiddler 的一些技巧分享

使用fiddler的時候,我們更多的是基于本地程式的調試,可惜fiddler捕捉不了本地(localhost或127.0.0.1)的http請求。難道fiddler就束手無策了嗎?當然不是。 

一般我們通路安裝在本地的伺服器程式時,使用的localhost或127.0.0.1,預設會繞過代理,直接通路目标伺服器,通過fiddler特有的請求方式,可以使本地請求及響應都被fiddler攔截。

關于 WEB/HTTP 調試利器 Fiddler 的一些技巧分享

方法一:在localhost後增加.fiddler

比如請求http://localhost:8080改為http://localhost.fiddler:8080即可

方法二:更簡單,在localhost或127.0.0.1後增加一個點即可

比如http://localhost.:8080

關于 WEB/HTTP 調試利器 Fiddler 的一些技巧分享

<a target="_blank" href="http://www.cnblogs.com/tt-0411/archive/2012/03/18/2404355.html">http://www.cnblogs.com/tt-0411/archive/2012/03/18/2404355.html</a>

<a target="_blank" href="http://stackoverflow.com/questions/8549749/how-to-capture-https-with-fiddler-in-java">http://stackoverflow.com/questions/8549749/how-to-capture-https-with-fiddler-in-java</a>

in fiddler2, go to the page tools-&gt;fiddler options ...-&gt;connections, remove the trailing semicolon from the value in the "ie should bypass fiddler for ..." field and restart fiddler2.

<a target="_blank" href="http://stackoverflow.com/questions/7681305/fiddler-does-not-capture-my-scripts-requests">http://stackoverflow.com/questions/7681305/fiddler-does-not-capture-my-scripts-requests</a>

也就是說,去掉 &lt;-loopback&gt; 後面的那個分号,儲存然後重新開機你的 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欺騙”技術。具體請參考:

<a target="_blank" href="http://fulong258.blog.163.com/blog/static/17895044200801145924745/">http://fulong258.blog.163.com/blog/static/17895044200801145924745/</a>

最後談談java裡面連接配接作業系統網絡協定棧的api。

#

協定

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第一層實體層,請參考:

<a target="_blank" href="http://www.infoq.com/cn/articles/java-7-sockets-direct-protocol">http://www.infoq.com/cn/articles/java-7-sockets-direct-protocol</a>

(1)基于fiddler來模拟限速

<a target="_blank" href="http://blogread.cn/it/article/4540?f=wb">http://blogread.cn/it/article/4540?f=wb</a>

(2)fiddler (二) script 用法

<a target="_blank" href="http://www.cnblogs.com/tankxiao/archive/2012/04/25/2349049.html">http://www.cnblogs.com/tankxiao/archive/2012/04/25/2349049.html</a>

(3)fiddler的進階用法-fiddler script

<a target="_blank" href="http://cube.qq.com/?p=973">http://cube.qq.com/?p=973</a>

(4)fiddler scriptsamples

<a target="_blank" href="http://fiddlerbook.com/fiddler/dev/scriptsamples.asp">http://fiddlerbook.com/fiddler/dev/scriptsamples.asp</a>

(5)fiddlerscript addcolumns

<a target="_blank" href="http://docs.telerik.com/fiddler/knowledgebase/fiddlerscript/addcolumns/">http://docs.telerik.com/fiddler/knowledgebase/fiddlerscript/addcolumns/</a>