天天看点

关于 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>