在 Java CloseableHttpClient 中排序 headers
Ordering of headers in Java CloseableHttpClient
我正在使用 java 中的 CloseableHttpClient 库来抓取网站,并根据网站添加自己的自定义 headers,然后再将请求发送到网页。
虽然 header 的排序不是强制性的,但某些网站确实使用 header 排序作为指纹识别的一种形式。特别是在 CloseableHttpClient 库中,在将 HTTP 请求发送到目的地之前,header 主机、Cache-Control、连接等被添加到末尾。它看起来像这样:
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15 646F636F6D6F3031",
"accept": "*/*",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US,en;q=0.9",
"host": "www.example.com",
"via": "1.1 localhost (squid/4.13)",
"x-forwarded-for": "www.example.com",
"cache-control": "max-age=259200",
"connection": "keep-alive"
我的代码是这样工作的:
CloseableHttpClient innerClient;
HttpGet request = new HttpGet(my_url);
client.execute(request, my_context);
header添加到 HttpGet object:
request.addHeader("Key", "Value");
无论我尝试过什么,Host 和它下面的 headers [如上例所示] 都会添加到最后。有没有办法控制他们的位置?
有一种方法可以使用 HttpClient 来处理这个问题。
如果我们想在发送请求之前执行一轮cleanup/reordering,我们可以使用addInterceptorLast()方法,如下所示。
HttpClient httpClient = HttpClientBuilder.create().addInterceptorLast(
new HttpRequestInterceptor() {
public void process(HttpRequest request, HttpContext context){
// Handle the ordering here.
}
}
).build();
我正在使用 java 中的 CloseableHttpClient 库来抓取网站,并根据网站添加自己的自定义 headers,然后再将请求发送到网页。
虽然 header 的排序不是强制性的,但某些网站确实使用 header 排序作为指纹识别的一种形式。特别是在 CloseableHttpClient 库中,在将 HTTP 请求发送到目的地之前,header 主机、Cache-Control、连接等被添加到末尾。它看起来像这样:
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15 646F636F6D6F3031",
"accept": "*/*",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US,en;q=0.9",
"host": "www.example.com",
"via": "1.1 localhost (squid/4.13)",
"x-forwarded-for": "www.example.com",
"cache-control": "max-age=259200",
"connection": "keep-alive"
我的代码是这样工作的:
CloseableHttpClient innerClient;
HttpGet request = new HttpGet(my_url);
client.execute(request, my_context);
header添加到 HttpGet object:
request.addHeader("Key", "Value");
无论我尝试过什么,Host 和它下面的 headers [如上例所示] 都会添加到最后。有没有办法控制他们的位置?
有一种方法可以使用 HttpClient 来处理这个问题。
如果我们想在发送请求之前执行一轮cleanup/reordering,我们可以使用addInterceptorLast()方法,如下所示。
HttpClient httpClient = HttpClientBuilder.create().addInterceptorLast(
new HttpRequestInterceptor() {
public void process(HttpRequest request, HttpContext context){
// Handle the ordering here.
}
}
).build();