我使用下面的代码来打开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马特
这曾经在过去的工作,但它已被停用的安全补丁的一部分。 显然没有在changelog的一个音符。 甚至有蝽象#7022056这个在bugs.sun.com。
还有一个类似的问题的另一头,那里的答案去到更多的细节,所以我只是链接它,而不是写我自己的。 :-)
唯一的解决办法似乎是设置sun.net.http.allowRestrictedHeaders
到true
或使用其他HTTP库,如已经提到的HTTP组件 。
该Host
头被填充HttpURLConnection
基于URL。 您无法打开foo.com
与Host=bar.com
。 从RFC
主机请求头字段指定被请求的资源的因特网主机和端口号,如从由用户或引用资源(通常的HTTP URL)中给出的原始URI所获得
顺便说一句,你也可以尝试的Apache HTTP组件 。
这是凌空如何处理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;
}
}