之前有从事过使用HttpClient 抓取网页和分析网页数据的工作,有时候要使用到HttpClient进行自动登陆网页的功能,这时候就不得不要去分析或者获取浏览器中的Cookie了。可是在一开始使用HttpClient的人或者都会有的一个问题:我们在浏览器上看到的一些Cookie,使用我们的程序时却获取不到,这是为什么呢。
对于这个问题我之前也一直有困扰,后来弄清楚后并在csdn的一些帖子上发表了点评论。这也有了后面的故事,有很多朋友来邮件问我关于HttpClient的一些Cookie问题,但因为我不常查看邮箱,有些邮件已经来了很久都没有发现,实在很抱歉。今天刚好有点时间,因此写下这篇文章,一是对我学的知识做下总结,不至于遗忘;二是给朋友们一个交代,希望能对搜到这文章的朋友有所帮助,谢谢支持。
首先我要说明的是HttpClient是模拟浏览器去发送请求,然后等待响应的。既然是这样,那么也就是说,HttpClient能获取到的是服务器端返送回写的Cookie。这没有什么不明白的的地方才对。这问题也就清楚了,HttpClient是模拟浏览器发送请求的,但是浏览器有时候会自动产生Cookie,HttpClient没有自动产生Cookie的功能,因此有些Cookie我们是无法有的。除非自己模拟。像这张图, 在Response中我们看到的set-Cookie,就是我说的服务器回写回来的Cookie,我们是一定能获取到的。我可以说,使用HttpClient完全是可以有和浏览器一样的Cookie的,但有些人却开始反对了:按照你的说法,为什么还有很多的Cookie我还是无法获取到呢? 这就是我们耐心往下看更详细的问题了。
如前面所说,有些Cookie明明不是浏览器的,但我还是无法获取到,这是为什么呢?就拿一个自动登陆的例子来说,我把用户名和密码发送到验证的URL中去,可是并不行,这是为什么呢。原因可能是我们请求登陆页面的时候,服务器已经回写一些Cookie到浏览器上了。那我们就该先是去请求登陆页面的RUL,把获取到的Cookie提取出来set进验证用户名的这次请求中,只要Cookie齐全,可能问题就解决了。也就是说,不同的请求可能会有不同的Cookie,HttpClient是没有自动跳转的功能的(要我们根据响应状态码进行手动跳转),因此我们要想拿到这些Cookie就得找到要去请求的URL。我这里教大家一个方法就是先清除浏览器器里面的所有Cookie,然后看请求的URL中那个是有回写Cookie的,自己再去请求。
这是技巧活,麻烦是必要的了。比如有些安全性很高的网站,有些Cookie是请求一张图片然后回写的,找出来都麻烦,但没办法,干呗!!还有一种Cookie是在JS中生成的,有些兄弟又犯难了,那怎么办。还能怎么办,把那个JS文件拿下来,用Java jdk里面的JS引擎运行咯。那么这样还有什么Cookie拿不到呢。
最后要严重说明的一点是,使用HttpClient实例的时候最好是使用单例,另外HttpClient是没有存储Cookie的功能的(在一次请求之后我们根据响应码作手动跳转时好像是有的),我们要注意SetCookie再请求。否则会出现的问题未知,具体问题具体分析了。
换了公司后, 已经有很长一段时间没有使用HttpClient了,不知道问题是否 已经说清楚,希望大家补充。邮箱:guanqing527@163.com,但不常查收,回复会有点晚,大家海涵。以上的只是个人的观点,不一定能解决大家的问题,欢迎大家批评指正,我其实也是刚出道不久的黄毛小子一个,学术有专攻罢了。谢谢大家支持!