我在尝试跨域使用 dojotoolkit 时遇到了问题。
我正在 apache Access-Control-Allow-Origin
和 Access-Control-Allow-Headers
中设置标头,这允许它在除 IE8 和 IE9 以外的所有浏览器中正常工作。我收到"访问被拒绝"消息的位置。
如
Line: 711
Character: 3
Code: 0
Error Message: Access is denied.
URL: http://remote.site.net/includes/dojotoolkit/dojo/_base/xhr.js
谁能对此有所了解?
Internet Explorer 8 和 9 不支持通过 XMLHttpRequest
的 CORS,而是通过专有XDomainRequest
。不幸的是,Dōjō 没有考虑到这一点,并尝试通过 XHR
加载跨域资源,以"访问被拒绝"错误结束。
幸运的是,Dōjō 提供了强大的dojo/request/registry
,允许您修改此行为:
定义使用XDomainRequest
获取资源的 XDomainRequest 提供程序:
function xdr(url, options) {
var def = new Deferred();
var xdr = new XDomainRequest();
if (xdr) {
xdr.onload = function(e) {
def.resolve(xdr.responseText);
}
xdr.open(options.method, url);
xdr.send();
return def;
}
def.reject(new Error('XDomainRequest not supported.'));
return def;
}
然后定义根据浏览器调用XHR
或XDR
的corsProvider
:
function corsProvider(url, options) {
if(window.XDomainRequest) {
return xdr(url, options);
}
return xhr(url, options);
}
注册corsProvider
以处理跨域请求:
var url = "http://cors-test.appspot.com/test";
var handle = request.register(url, corsProvider);
现在请求跨域资源也应该在IE中工作:
request.get(url).then(function(response) {
console.log(response);
});
查看实际操作:http://jsfiddle.net/phusick/LZZhs/
这适用于道城 1.8+,因为dojo/request
.如果您需要相同的dojo/_base/xhr
有dojox.io.xhrPlugins
,但我没有经验。无论如何,通过dojo/aspect
为旧版道条版本实现上述内容应该非常简单。
IE8和IE9通常不能很好地处理这些东西,除非你开始使用它们单独的XDomainRequest对象。 您使用什么来启动请求?
另请参阅处理其中大部分内容的其他 SO 问题:
- 带有 jQuery 和 XDomainRequest 的 CORS in IE8/9
- IE8/IE9 中的跨源标头