System.setProperty(“sun.net.http.allowRestrictedHeaders”,“true”)在jenkins中不起作用

时间:2015-08-21 09:36:29

标签: jenkins header request system

我正在尝试在http请求标头中发送原始标头但是当我得到它的值时,我得到的是null而不是我在origin标头中设置的url。

此外,我已通过使用以下

启用受限标题作为jenkins作业中请求标题的一部分发送
System.setProperty("sun.net.http.allowRestrictedHeaders", "true")

但似乎这个命令无效。

3 个答案:

答案 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)