首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java http客户机中自定义“主机”标头

如何在Java http客户机中自定义“主机”标头
EN

Stack Overflow用户
提问于 2018-09-13 14:03:57
回答 2查看 12.1K关注 0票数 15

这是我的密码:

代码语言:javascript
复制
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("http://127.0.0.1:8081/"))
    .header("Host", "test.example.com")
    .build();
client.send(request, HttpResponse.BodyHandlers.ofString());

因此,我看到上面的代码发送:

代码语言:javascript
复制
GET / HTTP/1.1
Connection: Upgrade, HTTP2-Settings
Content-Length: 0
Host: 127.0.0.1:8081
HTTP2-Settings: AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA
Upgrade: h2c
User-Agent: Java-http-client/10
Host: test.example.com

如您所见,它发送两个Host头(一个来自URI,另一个来自我指定的),但我希望它发送我指定的Host头,而不是从URI发送的。这个客户有可能吗?

编辑:在Java11中,情况会更糟(您需要将client.send行更改为:client.send(request, HttpResponse.BodyHandlers.ofString());):

代码语言:javascript
复制
java.lang.IllegalArgumentException: restricted header name: "Host"

如何自定义该头(用于测试虚拟主机)?

我还尝试了setHeader并得到了完全相同的问题(要么是双Host头,要么是异常)。

编辑:我报告了一个JDK错误

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-04 16:06:05

截至Java12 (EA build 22),它已经通过附加属性jdk.httpclient.allowRestrictedHeaders (参见https://bugs.openjdk.java.net/browse/JDK-8213696)解决。

因此,现在可以通过使用:Host执行代码来覆盖java -Djdk.httpclient.allowRestrictedHeaders=host ... (或任何其他受限的标头)。

票数 12
EN

Stack Overflow用户

发布于 2018-09-13 14:16:56

来自Java11客户端代码的行为似乎是正确的。主机一节详细阐述了细节。顺便提一下,从HttpRequest builder header(String name, String value)的文档中可以看出:

代码语言:javascript
复制
*    @throws IllegalArgumentException if the header name or value is not
*    valid, see <a href="https://www.rfc-editor.org/rfc/rfc7230#section-3.2">
*    RFC 7230 section-3.2</a>, or the header name or value is restricted
*    by the implementation.

更新:有关答案用于修饰JDK/12,请参见此。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52315472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档