调用Jenkins buildWithParameters接口时出现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

