Dojo跨域 - 访问被拒绝

时间:2013-01-29 16:20:45

标签: dojo cross-domain

我在尝试使用dojotoolkit跨域时遇到了问题。

我在apache Access-Control-Allow-OriginAccess-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

任何人都可以传播这个吗?

2 个答案:

答案 0 :(得分:4)

Internet Explorer 8和9 does not support CORS via XMLHttpRequest,但是通过专有XDomainRequest。不幸的是,Dōjō没有考虑到这一点,并尝试通过XHR加载跨域资源,该文件以 Access被拒绝错误结束。

幸运的是,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;
}

然后根据浏览器定义调用corsProviderXHR的{​​{1}}:

XDR

注册function corsProvider(url, options) { if(window.XDomainRequest) { return xdr(url, options); } return xhr(url, options); } 以处理跨域请求:

corsProvider

现在请求跨域资源也应该在IE中工作:

var url = "http://cors-test.appspot.com/test";
var handle = request.register(url, corsProvider);

查看实际操作:http://jsfiddle.net/phusick/LZZhs/

这适用于Dōjō1.8+,因为request.get(url).then(function(response) { console.log(response); }); 。如果您dojo/request需要dojo/_base/xhr,则dojox.io.xhrPlugins,但我没有经验。无论如何,为遗留的Dōjō版本实现前面提到的dojo/aspect应该是非常简单的。

答案 1 :(得分:0)

除非你开始使用他们独立的XDomainRequest对象,否则IE8和IE9通常不能很好地使用这些东西。你用什么来启动请求?

另见其他涉及大部分内容的SO问题: