You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Jenkins buildWithParameters接口时出现CORS错误求助

Jenkins跨域请求CORS错误排查

场景与问题

使用以下JavaScript代码向Jenkins任务发送POST请求:

function callJenkinsJob() {
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "https://<user>:<token>@<JENKINBS_SERVER>/job/<JOB_NAME>/buildWithParameters", true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
    //xhr.setRequestHeader("Sec-Fetch-Mode", "no-cors");
    xhr.setRequestHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
    xhr.setRequestHeader("Access-Control-Allow-Headers", "Authorization")
    xhr.setRequestHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With, observe");
    xhr.setRequestHeader("Access-Control-Max-Age", "3600");
    xhr.setRequestHeader("Access-Control-Allow-Credentials", "true");
    var param1 = get_base_url()
    xhr.send("MY_URL=" + param1);
}
function get_base_url() {
    var base_url = document.getElementById('base_url');
    console.log(base_url.innerText)
    return base_url.innerText
}

对应触发按钮的HTML代码:

<td align=right>
    <button onclick="callJenkinsJob()">Click</button>
</td>

在Edge浏览器(版本108.0.1462.54 64位)触发请求时,控制台抛出CORS错误:

Access to XMLHttpRequest at 'https://:@<JENKINBS_SERVER>/job/<JOB_NAME>/buildWithParameters' from origin 'http://' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Jenkins环境:版本2.332.1,已安装「CORS support for Jenkins Version1.1」插件,当前Access-Control-Allow-Headers配置内容:

Access-Control-Allow-Headers: Access-Control-Allow-Origin,access-control-allow-credentials,access-control-allow-origin,Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With, observe, access-control-max-age, access-control-allow-methods


问题分析与解决方案

1. 前端错误添加了响应端专属的CORS头

Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Max-Age这类头是Jenkins服务器在响应请求时才需要返回的头,前端发送请求时添加这些完全无效,还会干扰浏览器的预检请求逻辑,必须全部删除。

2. Jenkins的CORS配置缺失核心参数

当前配置仅设置了Access-Control-Allow-Headers,但缺少跨域最关键的Access-Control-Allow-Origin配置,直接导致预检请求返回时无该头,触发浏览器拦截。同时Access-Control-Allow-Headers中包含了多个无效的响应端头(如Access-Control-Allow-Origin),需要清理。

正确的Jenkins CORS配置需补充/调整:

  • Access-Control-Allow-Origin: 填写前端源地址http://<server>(若使用*则不能同时开启Access-Control-Allow-Credentials)
  • Access-Control-Allow-Methods: 设置为POST, OPTIONS(至少包含请求用到的POST和预检用的OPTIONS)
  • Access-Control-Allow-Headers: 保留必要的请求头(如Content-Type, Authorization),删除Access-Control-Allow-Origin这类响应端专属头
  • Access-Control-Allow-Credentials: 勾选true(适配请求中携带的用户名密码凭证)
  • Access-Control-Max-Age: 可设置为3600,减少预检请求次数

3. 请求参数未做URL编码

前端发送的MY_URL= + param1未做URL编码,若param1包含特殊字符(如&、空格等)会导致参数传递错误,需改用encodeURIComponent处理参数。


修正后的前端代码示例

function callJenkinsJob() {
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "https://<user>:<token>@<JENKINBS_SERVER>/job/<JOB_NAME>/buildWithParameters", true);
    // 仅保留必要的Content-Type请求头
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    // 开启凭证携带(适配URL中的用户名密码)
    xhr.withCredentials = true;
    var param1 = get_base_url();
    // 参数做URL编码,避免特殊字符问题
    xhr.send("MY_URL=" + encodeURIComponent(param1));
}
function get_base_url() {
    var base_url = document.getElementById('base_url');
    console.log(base_url.innerText);
    return base_url.innerText;
}

内容的提问来源于stack exchange,提问作者Rajesh Kazhankodath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:01:09