【问题标题】:XMLHttpRequest status 0 error in Mozilla and ChromeMozilla 和 Chrome 中的 XMLHttpRequest 状态 0 错误
【发布时间】:2014-02-20 13:50:45
【问题描述】:

我正在尝试进行跨域跨浏览器 .js 请求(没有任何库)。

var isIE8 = window.XDomainRequest ? true : false;
var invocation = createCrossDomainRequest();
var url = 'http://someserver.com/cgi-bin/targets.cgi?sid=';

function createCrossDomainRequest(url, handler)
{
    var request;
    if (isIE8)
    {
        request = new window.XDomainRequest();
    }
    else
    {
        request = new XMLHttpRequest();
    }
    return request;
}

function sendTarget(sid,target)
{
    if (invocation)
    {              
        var phone_id = getCookie('phone_cookie');
        url = url + sid +'&target='+target+'&phone_id='+phone_id+'&url='+encodeURIComponent(document.URL);
        if(isIE8)
        {
            invocation.onload = outputResult;
            invocation.open("GET", url, true);
            invocation.send();
        }
        else
        {
            invocation.open('GET', url, true);
            invocation.onreadystatechange = handler;
            invocation.send();
        }
    }
    else
    {
        var text = "No Invocation TookPlace At All";
    }
}

function handler(evtXHR)
{
    if (invocation.readyState == 4)
    {
        if (invocation.status == 200)
        {
            outputResult();
        }
        else
        {
            var text = "Invocation Errors Occured";
        }
    }
}

function outputResult()
{
    var response = invocation.responseText;
}

它适用于 IE,但不适用于 Mozilla 和 Chrome。这些浏览器收到错误“发生调用错误”。 invocation.status 为零。 Access-Control-Allow-Origin 设置为 *。

我需要做什么来解决这个问题?

我不能使用任何库,只需要清理 JS(技术问题)。没有jQuery!此代码需要在许多客户端网站上(不是一个或两个)。我不需要得到响应,只需要发送请求。而且我没有在 XMLHttpRequest 上循环 - 有什么想法吗?

【问题讨论】:

    标签: javascript xmlhttprequest cross-domain


    【解决方案1】:

    我采用了您在上面提供的代码,并对其稍作修改,使其更加通用。但是,您应该能够将其更改回适合的状态。以下代码适用于 Chrome 和 Firefox:

    var isIE8 = window.XDomainRequest ? true : false;
    var url = 'http://www.phobos7.co.uk/research/xss/simple.php';
    var resultText = '';
    var invocation = createCrossDomainRequest();
    makeRequest();
    
    function createCrossDomainRequest(url, handler) {
        var request;
        if (isIE8) {
            request = new window.XDomainRequest();
        } else {
            request = new XMLHttpRequest();
        }
        return request;
    }
    
    function makeRequest() {
        if (invocation) {
            if (isIE8) {
                invocation.onload = requestSucceeded;
                invocation.open("GET", url, true);
                invocation.send();
            } else {
                invocation.open('GET', url, true);
                invocation.onreadystatechange = handler;
                invocation.send();
            }
        } else {
            resultText = "No Invocation TookPlace At All";
        }
    }
    
    function handler(evtXHR) {
        if (invocation.readyState == 4) {
            if (invocation.status == 200) {
                requestSucceeded();
            } else {
                resultText = "Invocation Errors Occured";
            }
        }
    }
    
    function requestSucceeded() {
        resultText = invocation.responseText;
        outputResult();
    }
    
    function outputResult() {
        document.getElementById( 'output' ).innerHTML = resultText;
    }
    

    您可以在这里进行测试:http://jsfiddle.net/leggetter/3QfQe/

    来自该站点的响应标头(允许 CORS)是:

    Access-Control-Allow-Origin:*
    Connection:Keep-Alive
    Content-Type:text/html
    Date:Wed, 12 Feb 2014 22:48:37 GMT
    Keep-Alive:timeout=5, max=100
    Server:Apache
    Transfer-Encoding:chunked
    X-Powered-By:PHP/5.3.24
    

    只需要Access-Control-Allow-Origin:*

    如果您使用上面的 JavaScript 并确保设置了 Access-Control-Allow-Origin:* 标头,您将能够从 JavaScript 发出跨域请求。

    【讨论】:

    • 代码适用于您设置的 URL。当我在我的应用程序中尝试任何其他跨域 URL 时,它再次将状态设为 0。请提出建议。
    • "code is working" - 你的意思是说它“不工作”吗?我已经测试过了,它仍然对我有用。如果您遇到问题,请提供更多信息。
    • 它正在使用您的网址。当我用我的 URL 替换它时,它在 chrome 和 firefox 中再次给出状态为 0。
    • 感谢您的代码,但有问题。在我的浏览器中,我仍然得到状态 = 0,但在提琴手中,当我期望它时,我会看到状态 200。 Chrome 和 IE 都可以。这可能是什么?
    • 如果代码不起作用,重要的是要知道发出请求的页面在哪里托管?处理 HTTP 请求的脚本在哪里托管?您的浏览器开发人员工具会告诉您有关 HTTP 请求的哪些信息。要确定为什么完全相同的代码不能在不同的环境中使用,并且如果检查上述内容没有帮助,最好创建新的 StackOverflow 问题,清楚地说明您的环境设置。例如
    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2013-08-25
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多