当ajax目标是localhost时,IE 10和11中的访问被拒绝

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当ajax目标是localhost时,IE 10和11中的访问被拒绝相关的知识,希望对你有一定的参考价值。

我正在尝试在互联网上的服务器(http)之间进行ajax调用。并将其定位到我自己的localhost。 FF / Chrome / ETC ......有效。它只是一个IE问题。 IM使用IE 11和10。

请求甚至没有完成。 “拒绝访问”立即被抛出。

这是代码。只为你看。

不是IE8和IE9中的经典HTTP / HTTPS错误。这是别的,但文档没有帮助。

$jq.ajax({
            contentType: 'application/json',
            url: url,
            dataType: 'json',
            crossDomain: true,
            beforeSend: function (xhr) {
                xhr.withCredentials = true; 
                xhr.setRequestHeader("Authorization", "Basic " + $jq.base64.encode(username and password));
            },
            success: function (data, status, headers) {},
            error: function (xhr, status, error) {}

状态是0对象中的xhr,错误是“拒绝访问”

答案

Internet Explorer将此错误作为其安全区域功能的一部分引发。尝试从“Internet”区域中的原点访问“本地Intranet”区域中的资源时,使用默认安全设置会出现“访问被拒绝”错误。

如果您手动编写Ajax代码,则在尝试打开资源时Internet Explorer会引发错误。例如:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost/', true); // This line will trigger an error
xhr.send();

您可以通过将原始站点添加到“受信任的站点”安全区域来解决此错误。您可以通过将“http://client.cors-api.appspot.com”添加到“受信任的站点”区域并使用test-cors.org上的此测试页和您的localhost站点作为远程URL来测试此操作。

另一答案

除了可信站点要求之外,我发现问题没有得到解决,直到我使用与请求相同的协议作为我的来源,例如我的测试站点托管在https上但是使用http(没有s)的任何目标都失败了。

这仅适用于IE,Chrome只是礼貌地在调试控制台中记录警告并且不会失败。

另一答案

如果你试图在IE9中制作跨源的ajax请求,你需要使用XDomainRequest而不是XMLHttpRequest。有一个包装XDR的jQuery插件。您应该知道XDR存在一些明显的限制。

另一种选择是使用这样的库:https://github.com/jpillora/xdomain

另一答案

jQuery使用IE9中不支持的XMLHttpRequest对象实现ajax调用。你必须强迫它使用XDomainRequest

我使用这个jQuery插件解决了这个问题:

https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

另一答案

注意:

不要在Ajax中使用“http://www.domain.xxx”或“http://localhost/”或“IP”作为URL。仅使用没有地址的路径(目录)和页面名称。

虚假状态:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true);
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);

真实状态:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'dir/getSecurityCode.php', true);   // <<--- note
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);



function createAjax()
{
    var ajaxHttp = null;
    try
    {
        if(typeof ActiveXObject == 'function')
            ajaxHttp = new ActiveXObject("Microsoft.XMLHTTP");
        else 
        if(window.XMLHttpRequest)
            ajaxHttp = new XMLHttpRequest();
    }
    catch(e)
    {
        alert(e.message);
        return null;
    }
    //-------------
    return ajaxHttp;
};

以上是关于当ajax目标是localhost时,IE 10和11中的访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

在 IE 上使用 ajax 调用时遇到 403 错误

ajax在IE中无法正常测试原因的探索及学习

IE9 ajax保存权限被拒绝

//……关于同源策略

在 IE10 的 AJAX CORS 请求中添加自定义标头时,CORS 请求中止

ajax缓存问题