6

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

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

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

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

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

4

3 回答 3

8

回答我自己的问题。

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

于 2012-06-22T15:32:42.273 回答
4

OpenJDK 7 (build 43)的源代码显示他们使用静态初始化块来设置此属性,然后缓存该值。所以你需要在设置之前设置属性。这意味着它需要在首次加载 HttpURLConnection 类之前进行设置。

于 2015-06-11T00:10:59.713 回答
2

我对“预告片”标题有同样的问题

我也使用:

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

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

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

如果我从 Eclipse 运行小程序,它可以工作,但从浏览器运行时不起作用

于 2012-11-23T12:20:16.590 回答