我有一台运行服务的服务器,我希望在某个时间间隔内对服务执行ping请求,以便我知道它何时准备就绪。
获得以下ping.dat
文件:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:dvt="[private]">
<soapenv:Header />
<soapenv:Body>
<dvt:Ping/>
</soapenv:Body>
</soapenv:Envelope>
以下Javascript函数(将包含在setInterval()
函数中):
function doAjax() {
//load request document
$.ajax({
cache: false,
crossDomain: true,
async: true,
dataType: 'xml',
type: 'POST',
data: null,
url: "./ping.dat",
error: function(xhr, sta, err){ alert(err); },
success: function(ret, sta, xhr){
//ping service
$.ajax({
cache: false,
crossDomain: true,
async: false,
processData: false,
contentType: "text/xml; charset=\"UTF-8\"",
dataType: 'xml',
data: processXML(xhr.responseText),
type: 'POST',
url: "[private]",
error: function(xhr, sta, err){
alert(err);
},
success: function(ret, sta, xhr){
$('#response').text($.trim(ret));
},
complete: function(xhr, sta){
alert('complete');
},
});
}
});
}
function processXML(text){
var ret = null;
if ((typeof(ret) !== 'undefined')&&(text !== null)&&(text.length !== 0))
ret = $.trim(text.replace(/[\n\t]+/g, ''));
return ret;
}
当我使用SoapUI调用服务并加载ping请求时,它可以工作。
当我使用JS功能时,浏览器报告:
OPTIONS [private] 200(OK)jquery-1.10.2.js:8706
XMLHttpRequest无法加载[private]。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许来源“http:// localhost:8080”访问。
造成这种情况的原因是什么?
答案 0 :(得分:1)
消息清晰:请求资源上没有'Access-Control-Allow-Origin'标头。
如果您确实正在执行跨域Ajax请求,则服务器必须使用适当的HTTP标头进行响应。浏览器发出OPTIONS HTTP请求,并通过查看收到的标头来检查服务器是否“批准”访问。如果标题丢失,则浏览器有义务返回错误并禁止对资源的请求。
详情请见此处:HTTP access control (CORS)
SoapUI不像浏览器那样受the same origin security policy的影响,所以这就是为什么从SoapUI ping Web服务的原因。