我可以覆盖主机头,其中使用Java的HttpURLConnection的班?我可以覆盖主机头,其中使

2019-05-12 07:09发布

我使用下面的代码来打开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(“主机”,“测试:8080”)似乎没有任何效果,无论什么顺序调用的方法和主机重置目标服务器。 有没有办法覆盖的主机头,而无需使用一个不同的库?

TIA马特

Answer 1:

这曾经在过去的工作,但它已被停用的安全补丁的一部分。 显然没有在changelog的一个音符。 甚至有蝽象#7022056这个在bugs.sun.com。

还有一个类似的问题的另一头,那里的答案去到更多的细节,所以我只是链接它,而不是写我自己的。 :-)

唯一的解决办法似乎是设置sun.net.http.allowRestrictedHeaderstrue或使用其他HTTP库,如已经提到的HTTP组件 。



Answer 2:

Host头被填充HttpURLConnection基于URL。 您无法打开foo.comHost=bar.com 。 从RFC

主机请求头字段指定被请求的资源的因特网主机和端口号,如从由用户或引用资源(通常的HTTP URL)中给出的原始URI所获得

顺便说一句,你也可以尝试的Apache HTTP组件 。



Answer 3:

这是凌空如何处理HttpURLConnection类和重试政策的问题。

为它的快速的解决方法是扩大“HurlStack”类并覆盖“的createConnection”功能以0 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;
   }

}



文章来源: Can I override the Host header where using java's HttpUrlConnection class?