这个问题之前已经在这里提出并给出了一系列好的答案,主要是: Access-Control-Allow-Origin多个原始域?
但是,在应该采用的核准方法方面似乎存在着解释上的差距.通过W3文档阅读,我认为这是一种指导冲突.
首先,我们在许多先前的答案中看到了给出答案的正确方法,该答案规定主机服务器必须动态回显给定的"Origin"(如果它出现在预定义的"白名单"上). http://www.w3.org/TR/cors/#resource-implementation
然而,所使用的许多答案和方法也提到了空格分隔列表,该列表也可以用作将多个"起源"传递给允许的方法.如果我们看一下http://www.w3.org/wiki/CORS_Enabled上的另一篇W3文档,我们在页面的第一部分看到了一个例子:
Access-Control-Allow-Origin: http://example.com:8080 http://blah.example.com http://foo.example.com
Run Code Online (Sandbox Code Playgroud)
在这两种方法中,我同样很乐意将其纳入其中,但是可能会有大量的URL需要列入其中,因此我希望确保我第一次正确地执行此操作.如果有人对上述两种方法有任何见解,我将非常感谢您在选择中听到决定,以及是否有可能错过的推荐方法的明确指南.
我有一些(可能)长时间运行的ajax调用,如果用户导航到另一个页面,我想中止.以下jQuery代码在导航离开页面时调用所有挂起的XMLHttpRequest对象的中止:
$.ajaxSetup({
beforeSend: function(xhr) {
$(window).bind('beforeunload', function() {
xhr.abort();
});
}
});
Run Code Online (Sandbox Code Playgroud)
在测试用例中,我强制在被调用的服务器端操作上等待10秒.使用Firebug,我确认上面的代码确实导致所有挂起的ajax调用在我单击页面上的任何链接时立即停止.但是,浏览器仍然等待整整10秒,然后再转到下一页.IE似乎表现出相同的行为.这是一个已知的浏览器行为吗?在这种情况下,我能做些什么让用户立即离开页面?提前致谢.
我收到此错误
NETWORK_ERROR:XMLHttpRequest异常101
尝试从一个站点获取XML内容时.这是我的代码
var xmlhttp;
if(window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
if (xmlhttp==null) {
alert ("Your browser does not support XMLHTTP!");
return;
}
xmlhttp.onReadyStateChange=function() {
if(xmlhttp.readyState==4) {
var value =xmlhttp.responseXML;
alert(value);
}
}
xmlhttp.open("GET",url,false);
xmlhttp.send();
//alert(xmlhttp.responseXML);
}
xmlhttp.open("GET",url,false);
xmlhttp.send(null);
Run Code Online (Sandbox Code Playgroud)
有没有人有办法解决吗?
我正在使用Microsoft.XMLHTTP调用调用web服务:
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST", "/xxx/Converter.asmx/Convert", false);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send("conversionFolder=" + escape(conversionFolder));
if (xmlhttp.status == 200) {
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(xmlhttp.responseText);
... more stuff ...
return str;
}
else {
alert(xmlhttp.statusCode + " - " + xmlhttp.statusText);
}
Run Code Online (Sandbox Code Playgroud)
当我记得在本地web.config中添加HttpPost协议时,一切正常.
<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<webServices>
<protocols>
<add name="HttpPost"/>
</protocols>
</webServices>
<compilation debug="false"></compilation>
</system.web>
<system.codedom>
</system.codedom>
<!--
The system.webServer section is required for running ASP.NET AJAX under Internet
Information Services 7.0. It is not …Run Code Online (Sandbox Code Playgroud) 我注意到XMLHttpRequest.getResponseHeader()返回的实际标头的结果并不总是匹配(如果请求是以常规方式进行的).
例如,假设我正在提出xhr请求https://foo.example.com/api/resource/100.在Chrome的开发者控制台中,在"网络"下,我可以看到正在做出的响应 - 我还可以看到所有响应标头(例如,10).但是(复制粘贴的控制台):
> response
XMLHttpRequest
> response.getAllResponseHeaders();
"content-type: text/html
"
Run Code Online (Sandbox Code Playgroud)
对哪些标题可用有任何限制?这取决于响应类型吗?我记得为404s获得了一套完整的标题,但这只是400s的标题.
是什么赋予了?
SCRIPT7002:XMLHttpRequest:网络错误0x2ef3,由于错误00002ef3无法完成操作
目前没有有效的解决方案.
更新:也在IE11上注意到.
经过越来越多的调查,我得到了这样的结果:
我的问题是:
现在,我正在做的临时解决方案是,如果HTTP状态代码为零,则只重试最多3次.但它非常难看,因为即使上传请求有时也会失败,并且对于那些重试的请求变得缓慢,有时需要额外的100毫秒.
重现步骤:
我的IE版本:
现在我正在解决它,如果browser is IE10&& Request is POST&& 重试最多3次HTTP status code is 0.
如果有人可以帮我删除我丑陋的解决方案,我将不胜感激,因为有了这样的解决方案,即使请求进入服务器并且它返回0我也会重试(我试图通过测量xhr.send之间的时间来避免这种情况)和它的回调但它不可靠),如果IE10在comptMode中,如果IE11有同样的问题,添加到那个性能,它将占用我的机器〜每次重试之间的170ms.
我编写了一个运行良好的XMLHttpRequest,但返回一个空的responseText.
javascript如下:
var anUrl = "http://api.xxx.com/rates/csv/rates.txt";
var myRequest = new XMLHttpRequest();
callAjax(anUrl);
function callAjax(url) {
myRequest.open("GET", url, true);
myRequest.onreadystatechange = responseAjax;
myRequest.setRequestHeader("Cache-Control", "no-cache");
myRequest.send(null);
}
function responseAjax() {
if(myRequest.readyState == 4) {
if(myRequest.status == 200) {
result = myRequest.responseText;
alert(result);
alert("we made it");
} else {
alert( " An error has occurred: " + myRequest.statusText);
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码运行正常.我可以走过去,我得到readyState == 4和状态== 200但是responseText总是空白.
我收到错误调度的日志错误(在Safari调试中):getProperties,我似乎无法找到引用.
我在本地和远程服务器上运行Safari和Firefox中的代码.
放入浏览器时的URL将返回字符串并提供状态代码200.
我在Mac Widget中向相同的URL写了类似的代码,运行正常但是浏览器中的相同代码永远不会返回结果.
如果可以告诉(在javascript执行中)GET XMLHTTPRequest是否命中浏览器缓存而不是从服务器获取响应?
我的问题取决于我认为的几个假设.
该Origin头是由浏览器需要在CORS(跨源资源共享)请求被投入.
维基百科:
要启动跨源请求,浏览器会使用Origin HTTP标头发送请求.
首先要注意的是,有效的CORS请求始终包含Origin头.此Origin标头由浏览器添加,不能由用户控制.
W3:
如果请求URL源与原始URL源不同,请将源origin设置为全局唯一标识符[..].
请参阅caniuse.com并使用谷歌获取数百种不同类型的来源声称支持.
使用不同端口号的资源被认为具有不同的来源:
当且仅当所有这些值完全相同时,才认为两个资源具有相同的来源.[..]失败 - 相同的协议和主机但不同的端口.
如果协议,端口(如果指定了一个端口)和主机对两个页面都相同,则两个页面具有相同的原点.
Origin在向同一域"localhost"发出CORS请求但使用不同端口(从8411到8080)时,Internet Explorer 11不会发送标头.Opera,FireFox和Chrome会发送Origin标头.然而每个人都在说Internet Explorer 10+支持CORS吗?
我有一些代码在哪里进行提取调用.这利用了现代chrome/firefox中内置的window.fetch api.
代码有时会遇到401:未经授权的响应.这是正常的,我希望它被忽略,我可以用代码的流程做.但是,当我尝试运行它时,Chrome确实会显示一个难看的console.error消息.
我如何编程地防止此控制台错误显示在所有计算机上的开发控制台中(即,没有chrome dev过滤器或tampermonkey类型插件).
这是一个可以解决的样本:
fetch("http://httpstat.us/401", {requiredStatus: 'ok'})
.then(function() {
console.log("pass!");
}).catch(function() {
console.log("fail!");
});Run Code Online (Sandbox Code Playgroud)
xmlhttprequest ×10
javascript ×6
ajax ×3
cors ×2
cross-domain ×2
http ×2
abort ×1
asmx ×1
asp.net ×1
fetch-api ×1
https ×1
jquery ×1
post ×1
web-services ×1