微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ajax – 为什么我的跨域POST请求被OPTIONS请求预检?

根据Mozilla开发人员中心 HTTP access control文章,如果请求的Content-Type是application / x-www-form-urlencoded,跨站点POST请求可以“简单” – 即不需要预检.

我在Firefox中没有得到这种行为,我根本不理解为什么会这样.这是我的设置代码

function makeXDomainRequest(url,method,data) {
    var req =
        typeof XDomainRequest !== "undefined" ?
        new XDomainRequest() : new XMLHttpRequest();

    req.open(method || "GET",url,true);

    if (typeof req.onload !== "undefined") {
        req.onload = onResponseLoad;
        req.onerror = onRequestError;
    } else {
        req.onreadystatechange = onRequestStateChange;
    }

    if (data && typeof req.setRequestHeader === "function") {
        req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    } else {
        // no way to set Content-Type req header in IE's XDomainRequest:
        // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
    }

    req.send(data || null);
}

function onResponseLoad() {
    alert("Response!\n" + this.responseText);
}

function onRequestError(args) {
    alert("Error!");
}

function onRequestStateChange() {
    if (this.readyState === 4) {
        if (this.status === 200) {
            onResponseLoad.apply(this);
        } else {
            onRequestError.apply(this);
        }
    }
}

这是我正在ping的服务器:

// thanks to http://saltybeagle.com/cors/ for having this demo endpoint:
var URL = "http://ucommbieber.unl.edu/CORS/cors.PHP";

现在,如果我执行简单的POST请求 – 在上面的代码中将数据作为application / x-www-form-urlencoded发送 – 请求在Firefox中带有OPTIONS请求预检.它没有在Chrome中预检.在运行之前打开fiddler来亲眼看看:

makeXDomainRequest(URL,"POST","name=foobar");
// alerts "Response! Hello CORS [...] You sent a POST request. Your name is foobar"

这是fiddler中的预检OPTIONS请求(请注意Access-Control-Request-Method:POST标头,即使我指定了一个所谓的安全Content-Type而且没有自定义标头):

OPTIONS http://ucommbieber.unl.edu/CORS/cors.PHP HTTP/1.1
Host: ucommbieber.unl.edu
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://localhost
Access-Control-Request-Method: POST

这是怎么回事?这是Firefox中的错误,还是我做错了什么?谢谢!

解决方法

它确实是一个Firefox bug.它最终得到修复FF4b6: https://bugzilla.mozilla.org/show_bug.cgi?id=588920

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐