我可以覆盖使用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; }
}