我正在尝试在http请求标头中发送原始标头但是当我得到它的值时,我得到的是null而不是我在origin标头中设置的url。
此外,我已通过使用以下
启用受限标题作为jenkins作业中请求标题的一部分发送System.setProperty("sun.net.http.allowRestrictedHeaders", "true")
但似乎这个命令无效。
答案 0 :(得分:2)
我遇到了同样的问题,对我来说有用的是在pom.xml
中的surefire-plugin配置中设置系统参数:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<systemPropertyVariables>
<sun.net.http.allowRestrictedHeaders>true</sun.net.http.allowRestrictedHeaders>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
答案 1 :(得分:1)
在Jenkins作业中不工作的根本原因可能是你的Jenkins实例正在使用OpenJDK来构建项目。
在OpenJDK 7的以下源代码中,它显示它使用静态块来设置allowedRestrictedHeaders
系统属性,并且在初始化HttpURLConnection
后不会重置。
如果您在pom.xml
解决方案之外设置JVM arg以下,它也会起作用。
“ - Dsun.net.http.allowRestrictedHeaders =真”
static {
maxRedirects = java.security.AccessController.doPrivileged(
new sun.security.action.GetIntegerAction(
"http.maxRedirects", defaultmaxRedirects)).intValue();
version = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("java.version"));
String agent = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("http.agent"));
if (agent == null) {
agent = "Java/" + version;
} else {
agent = agent + " Java/" + version;
}
userAgent = agent;
validateProxy = java.security.AccessController.doPrivileged(
new sun.security.action.GetBooleanAction(
"http.auth.digest.validateProxy")).booleanValue();
validateServer = java.security.AccessController.doPrivileged(
new sun.security.action.GetBooleanAction(
"http.auth.digest.validateServer")).booleanValue();
enableESBuffer = java.security.AccessController.doPrivileged(
new sun.security.action.GetBooleanAction(
"sun.net.http.errorstream.enableBuffering")).booleanValue();
timeout4ESBuffer = java.security.AccessController.doPrivileged(
new sun.security.action.GetIntegerAction(
"sun.net.http.errorstream.timeout", 300)).intValue();
if (timeout4ESBuffer <= 0) {
timeout4ESBuffer = 300; // use the default
}
bufSize4ES = java.security.AccessController.doPrivileged(
new sun.security.action.GetIntegerAction(
"sun.net.http.errorstream.bufferSize", 4096)).intValue();
if (bufSize4ES <= 0) {
bufSize4ES = 4096; // use the default
}
allowRestrictedHeaders = ((Boolean) java.security.AccessController.doPrivileged(
new sun.security.action.GetBooleanAction(
"sun.net.http.allowRestrictedHeaders"))).booleanValue();
if (!allowRestrictedHeaders) {
restrictedHeaderSet = new HashSet<String>(restrictedHeaders.length);
for (int i = 0; i < restrictedHeaders.length; i++) {
restrictedHeaderSet.add(restrictedHeaders[i].toLowerCase());
}
} else {
restrictedHeaderSet = null;
}
}
答案 2 :(得分:0)
我要补充卡迪和汉克的答案:
如果您使用sun.net.www.protocol.http.HttpURLConnection来执行请求(我使用弹簧启动TestRestTemplate进行了此操作),则系统属性仅静态读取一次。
这意味着,尽管更改系统属性值,但在执行请求之前立即设置属性可能不会影响HttpURLConnection。
因此请确保尽早进行设置(例如,通过Maven)