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