在Http请求中的Cookie种类与状态详解

很多人以为Cookie就是存储在浏览器所在电脑硬盘中的那个txt文件,在必要的时候浏览器会读取这个文件然后发送到服务器端。其实这只是cookie的一个方面。Cookie可以分为存储在内存中和存储在硬盘两种方式,存储在硬中的时候,一个网站通常有一个.txt文件来存Cookies,一个Cookie对象最终转换为txt文件中的一条记录。保存在浏览器线程分配的内存中的Cookie对象,在关闭这个浏览器窗口后,就销毁了。很多人并不知道cookie在内存中存在这个方面。以前我写过一个文章介绍这两种cookie,http://blog.csdn.net/sundacheng1989/article/details/8194466,以及内存中cookie的应用。

 

最近在研究微信,灵感来源于网上有一个Python版本的测试谁把你拉黑了的代码。我就想写一个C#版本的。最终也写出来了,但是腾讯在服务器端加了很多限制,所以不太好用。其实原来很简单,就是利用网页版的微信,然后通过使用抓包工具,来查看每次的请求都有哪些内容,然后用C#实现这些HTTP请求。

 

在研究抓包的过程中,确实学到了很多东西。比如说最重要的一点就是关于内存中cookie的问题。在使用C#模拟浏览器来完成一些HTTP请求的时候,最繁琐的东西就是cookie, 这里说的是硬盘中的cookie,因为浏览器可以用cookie,这里包含了一些身份信息,而我们使用C#的时候是没有办法用的。所以为了避免这个问题,我使用了Chrome的匿名模式来进行网页微信的登录。

 

Chrome的匿名模式,是不会使用任何硬盘cookie文件的。在网页版微信发出一次HTTP请求之后,我使用Fiddler抓包工具去查看这次请求的内容,意外的东西发现了。

 

在Http请求中的Cookie种类与状态详解_第1张图片

 

 

竟然发现在Chrome匿名模式下,HTTP请求也是会携带cookie。但是注意,这里并不是硬盘上的cookie,而且浏览器内存中的cookie!这种cookie很特别,在关闭浏览器后就会消息,所以只存在于这次的浏览器窗口。

 

其实,既然内存中有相关的cookie,那么肯定是在某个时候,服务器端向浏览器端发送了相关的cookie信息。因为我就从fiddler中找这次请求前边的请求信息,果然是在一次的HTTP respond中携带了相关的cookie信息。

 

在Http请求中的Cookie种类与状态详解_第2张图片

 

 

 

所以总结一下,cookie分为两种,一种是硬盘上的,另一种是内存中的。Chrome的匿名模式只是不会使用硬盘中的cookie,但是每次的HTTP request请求还是会携带内存中的cookie信息。

 

在研究的过程中,还有一个很重要的知识点就是如何在C#中使用内存中的cookie.当我在使用C# WebAPI的HttpClient类向微信的服务器发出请求的时候,明明是同样的URL,同样的参数,但是使用C#代码与使用浏览器获取到的结果就是不一样。最后找到关键的问题所在。因为浏览器每次都携带内存中的cookie,而C#代码没有cookie,所以造成了结果不一样。那么怎么解决这个问题?其实微软的HttpClient类已经能够很好的解决,我之所以遇到问题,是因为每次要发起Http请求的时候都会new一个新的类,但是如果我使用以前的HttpClient,当服务器端返回cookie的话,就会保留在这个对象中,或者说内存中,下次再使用的话,就会携带cookie发起请求。所以,在应用程序中,一定要使用同一个HttpClient,这样才能很好的利用cookie!

 

你可能感兴趣的:(技术积累,HTTP)