我可以覆盖使用java的HttpUrlConnection类的Host头吗?

时间:2011-10-04 13:43:54

标签: java http networking httpurlconnection urlconnection

我正在使用以下代码在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

3 个答案:

答案 0 :(得分:32)

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

另一个标题有一个similar question,其中的答案更多地涉及细节,所以我只是将其链接而不是自己编写。 : - )

唯一的解决方法似乎是将sun.net.http.allowRestrictedHeaders设置为true或使用其他http库,如已提及的http components

答案 1 :(得分:7)

Host标头由HttpURLConnection根据网址填充。您无法使用foo.com打开Host=bar.com。来自RFC

  

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

顺便说一句,你也可以试试apache http components

答案 2 :(得分:-1)

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

快速修复它是扩展“HurlStack”类并覆盖“createConnection”函数以返回带有ChunkStreamMode为0的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;
   }

}