HttpURLConnection不会让我设置“Via”标题

时间:2012-06-21 21:53:30

标签: java httpurlconnection

我正在尝试使用java.net.HttpURLConnection向服务器发出HTTP请求。我需要发送的HTTP标头之一是“Via”。在我的代码中有类似的东西:

connection.addRequestProperty("X-test", "test_header_contents"); // just a sanity test
connection.addRequestProperty("Via", "via_header_contents");

当我使用数据包嗅探器时,我可以看到测试标题正在通过但是via标头不是。我知道Via是一个“限制”标题,所以我添加了这一行:

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

这条线在我过去遇到同样的问题时起作用,但现在不能正常工作。我知道系统属性已设置,因为我在尝试添加HTTP标头之前调用System.getProperty并返回true。我还应该做些什么才能发送via标头?就像我说的,这之前有效,但现在不行。我认为唯一改变的是我从Java 6转到7.感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:7)

回答我自己的问题。

问题是我在程序中设置系统属性sun.net.http.allowRestrictedHeaders太晚了。我在尝试发送标题之前立即设置它,这太晚了,显然是因为HttpURLConnection对属性进行了某种缓存。通过在程序开头设置属性,我能够完成所有工作。

答案 1 :(得分:4)

source code for OpenJDK 7(build 43)显示它们使用静态初始化块来设置此属性,然后缓存该值。因此,您需要在设置之前设置属性。这意味着需要在首次加载HttpURLConnection类之前设置它。

答案 2 :(得分:2)

我遇到与“预告片”标题相同的问题

我也用:

 System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

我在主类的静态构造函数中执行它并使用JVM参数传递

<PARAM name="java_arguments" value="-Dsun.net.http.allowRestrictedHeaders=true">

如果我从Eclipse运行applet,但从浏览器运行时不起作用

,它会起作用