我们用apache的HttpClient这个库消费云端的Restful API时,一般都需要两次HTTP调用,第一次获得某种token,比如获取防止跨域请求伪造攻击Cross-site request forgery - CSRF的token,或者比如微信API的access token,第二次再进行真正的API消费。

通常情况下,第一次请求完毕后,服务器都会给客户端返回一些cookie字段,在第二次请求时,如果使用的是postman测试工具或者apache的HttpClient这个库,cookie字段都会自动被附加在第二次请求的HTTP头部。详情可以参考我写的另一篇博客:OData service parallel performance measurement – how to deal with XSRF token in Java Program and JMeter
https://blogs.sap.com/2017/08/28/odata-service-parallele-performance-measurement-how-to-deal-with-xsrf-token-in-java-program-and-jmeter/

本文就来介绍apache的HttpClient,在发送第二个Http请求时,是如何自动插入从第一个请求获得的服务器颁发的cookie的。

首先进入HttpClient的单步调试:InternalHttpClient.doExecute方法:

第85行的origheaders,即取出程序员在代码里指定的http请求头部字段,比如basic Authentication,content-type,token等等:

这个cookie是什么时候传进来的?

看来我们必须进入httpcore-4.4.3.jar这个apache HttpClient的实现里去调试。

经过观察发现,一旦我执行完204行的conn.sendRequestHeader方法,就能观察到Cookie被自动设置了,所以奥妙就在第204行里。

自动添加Content-Length头部字段:

由此可见Content-length是通过方法entity.getContentLength()自动计算出来的,因此我们程序员不必在自己的应用代码里重复这个计算动作。

自动加入host字段:

自动加入Connection: Keep-Alive

UserAgent的自动填充:Apache-HttpClient/4.5.1, 这个也不用程序员操心。

终于到了我要找的RequestAddCookies这个HTTPRequestInterceptor了。光从这个类的字面意思就能猜到它和HTTP请求的Cookie有关。

新建一个Cookie,这个CookieOrigin构造函数里的hpst,path和secure标志位都是Chrome开发者工具的Cookie标签页里能看到。

从 Cookie Store里取出前一次请求中由服务器返回的Cookie:

这里把Cookie store里的cookie加到第二个请求的头部字段,谜底就这样解开了。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

使用apache的HttpClient进行http通讯,隐藏的HTTP请求头部字段是如何自动被添加的相关推荐

  1. Apache Common HttpClient使用之七种武器

    1.拳头之Get/Post 拳头是最基本的一重武器,也是最重要的,好比练武之人必须先扎稳马步. java 代码 HttpClient httpclient=new HttpClient();//创建一 ...

  2. httpclient工具使用(org.apache.httpcomponents.httpclient)

    httpclient工具使用(org.apache.httpcomponents.httpclient) 引入依赖 <dependency><groupId>org.apach ...

  3. SSL自签名的实现类org apache commons httpclient contrib ssl EasySSLP

    如果是编写的一个通用的客户端,可以用于支持访问所有的HTTP及HTTPS协议请求,这个时候SSL自签名就非常管用了,如soupUI,它是一款用于WEBSERVICE的性能及压力测试工具,可以访问所有的 ...

  4. Rejecting re-init on previously-failed class java.lang.Class<org.apache.commons.httpclient.HttpClien

    Rejecting re-init on previously-failed class java.lang.Class<org.apache.commons.httpclient.HttpCl ...

  5. org.apache.commons.httpclient 访问需要验证的webservice的一些问题

    1.httpclient验证问题 webservice需要验证时,直接发送请求会返回 HTTP/1.1 401 Unauthorized 错误 这时候需要设置: Credentials default ...

  6. HttpClient 同时支持发送http及htpps请求

    HttpClient简述: HttpClient是Apache Jakarta Common下的子项目,用来提供高效的.最新的.功能丰富的支持HTTP协议的客户端编程工具包.HTTP Client和浏 ...

  7. 详解用Java实现爬虫:HttpClient和Jsoup的介绍及使用(请求方式、请求参数、连接池、解析获取元素)

    一.介绍:何为爬虫 网络爬虫(Web crawler)也叫做网络机器人 可以代替人 自动地在互联网中进行数据信息的采集和整理 是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 可以自动采集所有 ...

  8. HttpClient使用详解 get与post请求

    转自:https://www.jianshu.com/p/375be5929bed 一.HttpClient使用详解与实战一:普通的GET和POST请求 简介 HttpClient是Apache Ja ...

  9. [iOS] UITextField隐藏软键盘心得(隐藏自身软键盘、点击Return自动转到下个文本框、轻触背景隐藏软键盘)...

    作者:zyl910 关于隐藏软键盘,网上的办法良莠不齐,大多是通过实现UITextFieldDelegate来隐藏软键盘,该方法代码较多,且在文本框很多的时不好处理.我经过搜索与摸索,找到了最佳的处理 ...

最新文章

  1. java技术培训之File类中常用的构造方法
  2. 从一个死锁看mysql innodb的锁机制
  3. 一份火爆全网的刷题笔记分享!offer 到手!
  4. cvRemap 对图像进行普通几何变换
  5. linux下web压力测试工具ab使用及详解
  6. Bash数组操作教程
  7. 深入解析Node.js setTimeout方法的执行过程
  8. mysql的rowscn_Oracle ORA_ROWSCN 伪列 说明
  9. Redis 持久化(学习笔记五)
  10. 又到年关,年终奖你能拿多少?
  11. Intellij Idea15开发Web网站
  12. WinAPI: SetTextJustification - 设置两端对齐
  13. 2016-08-31
  14. chrome怎么调用硬件_浏览器发展简史——IE帝国是如何被chrome打败的?
  15. 使用Html5+C#+微信 开发移动端游戏详细教程 :(二)准备工作开发环境
  16. Nacos忘记密码Nacos密码加密方式
  17. 高等数学---常见的几个泰勒公式
  18. 我在华为做外包的真实经历!
  19. springboot+uniapp上传图片
  20. Labview连接sql server数据库

热门文章

  1. 【转】如何更改VS2010的[默认开发语言]默认环境设置 .
  2. 机器学习中的不平衡分类方法(part6)--支持向量机
  3. 走近分形与混沌(part1)--分形是趋于无穷的极限,是画不出来的
  4. SAP UI5 应用开发教程之五十 - 如何使用 Cordova 将 SAP UI5 应用生成一个能在 Android 手机上安装的混合应用
  5. web 应用在线编辑器 glitch 简介
  6. 使用 SASS Mixin 编写 clean code
  7. 如何构建和部署 SAP Commerce Cloud 项目
  8. SAP Spartacus里的@mixin visible-focus
  9. SAP Spartacus产品转盘页面(ProductCarousel)的产品数据批量加载实现细节
  10. SAP Spartacus user-addresses.effect.ts里发送地址加载成功的action,会触发我们自己的reducer