`
JerryWang_SAP
  • 浏览: 1032397 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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

阅读更多

我们用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的原创文章,请关注公众号"汪子熙":

 

 
0
0
分享到:
评论

相关推荐

    org.apache.http.entity.mime

    在Android开发中,由于HttpClient库的稳定性和强大的功能,即使在Android API级别33及更高版本中不再内置,许多开发者依然选择使用Apache HttpClient,包括`org.apache.http.entity.mime`包中的类,来进行网络通信和...

    四、使用HttpClient上传测试文件服务器

    5. **设置请求头**: 如果服务器需要特定的头部信息,比如`Content-Type`或`Authorization`,可以使用`setHeader`方法来添加。 6. **执行请求**: 将构建好的请求通过HttpClient发送出去,调用`execute`方法。这将...

    java批量执行post请求分析并对比结果

    在Java中,我们可以使用多种库来执行POST请求,如Apache HttpClient、OkHttp或者Java内置的HttpURLConnection。这里我们主要以HttpClient为例进行讲解。 1. **Apache HttpClient库的使用**: Apache HttpClient是...

    httpClient_httpParser.jar

    2. **事件驱动**:通过回调函数,HttpParser可以在解析过程中触发特定事件,如遇到请求行、头部字段或主体内容,使得处理逻辑更加清晰。 3. **低内存消耗**:由于其C语言的实现,HttpParser相比纯Java的解决方案,...

    commons-httpclient-3.0.1-src.zip

    通过源码,我们可以学习如何设置和获取 HTTP 头部字段,如何处理不同类型的请求体(如表单数据、文件上传),以及如何解析响应状态码和响应体。 4. **认证和安全机制**:HttpClient 支持多种认证机制,如 Basic、...

    HttpClient 4.0的post()方法4个关键“头信息”设置

    根据提供的代码片段和描述信息,我们可以看到在使用HttpClient进行POST请求时,设置了四个重要的HTTP头部信息:`Referer`、`Content-Type`、`Accept`和`User-Agent`。下面将详细介绍这四个头部信息的作用及如何正确...

    httpclient完美教程

    10. **实战应用**:本教程将通过一系列实例,演示如何在实际项目中使用HttpClient进行网络请求,包括简单的GET请求、复杂POST请求、处理文件上传下载、处理异常情况等。 通过阅读《HttpClient完美教程》,开发者...

    HttpClient 教程

    **HttpClient**是Apache组织下的一款开源库,主要用于Java应用中发送HTTP请求和处理响应。它提供了一种高效、灵活的方式,来构建和执行HTTP请求,同时支持HTTPS协议。在HttpClient中,**HttpCore**扮演着核心组件的...

    使用Java获取HTTP头信息

    在实际开发中,除了`HttpURLConnection`,我们还可以使用第三方库,如Apache HttpClient或OkHttp,它们提供了更丰富的功能和更好的性能。 至于压缩包子文件的文件名称列表"com",这看起来像是一个被打包的Java项目...

    httpclient-tutorial.pdf

    **2.8 HttpClient代理配置**:介绍如何配置HttpClient使用代理服务器进行网络请求。 #### 三、状态管理 **3.1 HTTP Cookie** - **3.1.1 Cookie版本**:解释不同版本Cookie之间的差异。 - **3.2 Cookie规范**:...

    用java客户端程序模拟校园网网页认证

    在Java中,我们可以使用HttpURLConnection或Apache HttpClient库来发送这样的请求。这些库提供了发送HTTP请求和处理响应的功能。 1. **HttpURLConnection**:这是Java标准库的一部分,可以用来发送GET和POST请求。...

    apache-mime4j-0.7.2

    3. **字段处理器**:对MIME头部的各个字段进行操作,支持添加、删除和修改。 4. **内容处理器**:处理MIME内容,可以是文本、二进制数据或其他MIME消息。 5. **MIME树模型**:提供了一种结构化的方式来表示MIME消息...

    http客户端程序

    下面是一个简单的Java `HttpClient`使用示例,展示如何发送GET请求和将响应写入文件: ```java import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org....

    Java利用HttpClient模拟POST表单操作应用及注意事项

    2. 转向处理:如果服务器返回301(永久重定向)或302(临时重定向),HttpClient不会自动处理,需要手动获取“Location”头部并构造新的请求。 3. 关闭连接:在完成请求后,记得关闭HttpClient的连接,释放资源。 `...

    Java代码实现:CSDN博客认证头x-ca-nonce与x-ca-signature的自动生成.zip

    4. **发送请求**:使用Java的`HttpURLConnection`或第三方库如Apache HttpClient、OkHttp等发送带有这些安全头的HTTP请求。 在压缩包中的Java代码实现了这个过程,可以作为开发者在与CSDN博客API交互时的一个参考。...

    http basic authentication通过post方式访问api示例分享 basic认证示例

    要使用基本认证访问API,客户端需要在每个请求中添加`Authorization`头部,其值的格式为`Basic base64-encoded(username:password)`。首先,将用户名和密码连接成`username:password`字符串,然后对这个字符串进行...

    httpmine4.5.rar

    这就是Apache HttpClient项目中的httpmime-4.5.jar包,它为开发者提供了一套强大的工具,用于处理HTTP请求中的多部分数据和MIME类型。 httpmime-4.5.jar是Apache HttpClient库的一部分,该库是一个Java实现的HTTP...

    http-call.rar_HTTP_HTTP协议_httpcall_site:www.pudn.com

    例如,使用Python的requests库,Java的HttpURLConnection或Apache HttpClient,JavaScript的fetch或axios库等,可以方便地创建和发送HTTP请求,获取响应,并进行解析处理。 在`http-call.docx`这个文档中,可能包含...

    http传输接收json.zip

    在Java中,我们可以使用多种库来处理HTTP请求和JSON数据,例如使用`HttpURLConnection`类来构建基础的HTTP请求,或者使用Apache HttpClient等更高级的库来简化操作。对于JSON解析,通常会用到如Jackson、Gson或org....

    httpProxy-java

    2. HTTP协议理解:为了正确处理HTTP请求和响应,开发者需要熟悉HTTP协议的细节,包括请求方法(GET、POST等)、状态码、头部字段等。 3. HttpURLConnection和HttpClient:Java内置了HttpURLConnection类,它是处理...

Global site tag (gtag.js) - Google Analytics