我正在尝试使用在浏览器中运行的jQuery脚本将数据写入Splunk。我的“inputs.conf”文件中已经包含以下内容:
crossOriginSharingPolicy = *
但是,我得到的错误是:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver.myco.com:8088/services/collector/event.
(Reason: missing token 'content-type' in CORS header 'Access-Control-Allow-Headers' from CORS preflight channel).
我还没有找到从Splunk设置“访问控制允许标题”的方法。
这是JS代码的一个片段,尽管我不确定甚至没有必要显示它(注释行是我在绝望中尝试过的事情,但没什么区别):
var dfr = $.ajax({
url: config.endpoint,
method: 'post',
// headers: {
// "Access-Control-Allow-Origin" : "*",
// "Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS",
// "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
// },
// crossDomain: true,
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", header);
},
data: JSON.stringify({ event: post }),
contentType: "application/json; charset=utf-8",
dataType: "json"
});
有什么建议么?我是否需要通过代理访问Splunk?
最佳答案
我认为您可能需要设置contentType: application/x-www-form-urlencoded
并设置数据格式(即,基本上就像普通的查询字符串一样:名称-值对,名称后跟=
,然后是值,名称-值对彼此分开其他,由&
)。
那是因为Splunk似乎根本不支持application/json
请求。
Discussion elsewhere表示期望POSTs
为application/x-www-form-urlencoded
。
但这只能解决content-type
问题。因为您的请求发送了一个Authorization
请求 header ,所以它也会自己触发CORS preflight OPTIONS
request触发器。
而且,如果Splunk发回的Access-Control-Allow-Headers
响应 header 不包含Authorization
,那么您将遇到与Content-Type
相同的问题。
但是,Dunno可能在幕后Splunk已经在Authorization
响应 header 发送回的 header 名称集中包含了Access-Control-Allow-Headers
。