我是否可以覆盖使用java的HttpUrlConnection类的Host标头?

我使用以下代码在java中打开http连接:

 URL url = new URL("http://stackoverflow.com");
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.setDoOutput(true);
 conn.setRequestMethod("GET");
 conn.setRequestProperty("Host", "Test:8080");
 conn.getOutputStream();

然而,调用conn.setRequestProperty(“Host”,“Test:8080”)似乎没有任何效果,无论我调用方法的顺序如何,Host都会重置为目标服务器。有没有办法在不使用其他库的情况下覆盖 Host 标头?

蒂亚马特


答案 1

这在过去曾经有效,但作为安全修复的一部分已被禁用。显然在更新日志中没有注释。在 bugs.sun.com,甚至还有像#7022056这样的错误。

另一个标题也有一个类似的问题,其中的答案更多地涉及细节,所以我只是链接它而不是自己写。:-)

唯一的解决方法似乎是设置或使用另一个http库,如已经提到的http组件sun.net.http.allowRestrictedHeaderstrue


答案 2

标头由 基于 URL 的 填充。您无法使用 打开。从 RFCHostHttpURLConnectionfoo.comHost=bar.com

Host request-header 字段指定所请求资源的 Internet 主机和端口号,这些主机和端口号是从用户或引用资源(通常是 HTTP URL)提供的原始 URI 中获取的

顺便说一句,你也可以尝试apache http组件


推荐