我可以覆盖使用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头?

TIA Matt

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

对于另一个标题有一个类似的问题 ,其中答案更多地涉及细节,所以我只是将其链接而不是自己编写。 🙂

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

Host头由基于URL的HttpURLConnection填充。 您无法使用Host=bar.com打开foo.com 。 来自RFC

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

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

这是volley如何处理HTTPUrlConnection和重试策略的问题。

快速修复它是扩展“HurlStack”类并覆盖“createConnection”函数以返回一个HTTP的ChunkStreamMode的HTTPUrlConnection

 public class CustomHurlStack extends HurlStack { public CustomHurlStack(){ super(); } @Override protected HttpURLConnection createConnection(URL url) throws IOException { HttpURLConnection connection = super.createConnection(url); connection.setChunkedStreamingMode(0); return connection; } 

}