XMLHttpRequest将POST更改为OPTION

Kal*_*ico 50 javascript xmlhttprequest

我有这个代码:

net.requestXHR = function() {
    this.xhr = null;
    if(window.XMLHttpRequest === undefined) {
        window.XMLHttpRequest = function() {
            try {
                // Use the latest version of the activex object if available
                this.xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0");
            }
            catch(e1) {
                try {
                    // Otherwise fall back on an older version
                    this.xhr = new ActiveXObject("Mxsml2.XMLHTTP.3.0");
                }
                catch(e2) {
                    //Otherwise, throw an error
                    this.xhr = new Error("Ajax not supported in your browser");
                }
            }
        };
    }
    else
        this.xhr = new XMLHttpRequest();
}
net.requestXHR.prototype.post = function(url, data) {
    if(this.xhr != null) {
        this.xhr.open("POST", url);
        this.xhr.setRequestHeader("Content-Type", "application/json");
        this.xhr.send(data);
    }
}

    var rs = new net.requestSpeech();
    console.log(JSON.stringify(interaction));
    rs.post("http://localhost:8111", JSON.stringify(interaction));
Run Code Online (Sandbox Code Playgroud)

当发送执行时,我有这个日志:

OPTIONS http://localhost:8111/ [HTTP/1.1 405 Method Not Allowed 74ms]
Run Code Online (Sandbox Code Playgroud)

而在localhost:8111我有一个接受帖子的reslet serverResource,它是同源策略的问题?我已修改restlet以放置allow-origin标头,我用另一个GET http请求(在jquery中)测试它并正常工作.我有相同原点解决的问题因为我使用html5浏览器而我的服务器将标题放在响应中,那么为什么send会显示这个错误?为什么要改变OPTION的POST?谢谢!

可能重复?:我认为不是,但确实如此,两个问题的问题都是一样的,但我的是指的是浏览器存在问题,另一个是指jquery.根据经验,时间不计算重复,答案是不同的,但两个问题相互补充是正确的.

Wla*_*ant 71

是的,这是"同源政策的问题".您正在向不同的服务器或不同的端口发出请求,这意味着它是跨站点HTTP请求.以下是文档对此类请求的说法:

此外,对于可能对服务器数据产生副作用的HTTP请求方法(特别是对于除某些MIME类型以外的HTTP方法GET或用于 POST某些MIME类型),规范要求浏览器"预检"请求,从而请求支持的方法.服务器使用HTTP OPTIONS请求方法,然后,在服务器"批准"后,使用实际的HTTP请求方法发送实际请求.

CORS标准中有更详细的描述("预检交叉请求"部分).您的服务器需要允许OPTIONS请求,并发送一个响应Access-Control-Allow-Origin,Access-Control-Allow-Headers并且Access-Control-Allow-Methods头部允许请求.然后浏览器将发出实际POST请求.

  • 当我无法修改服务器的行为时,我该怎么办?我无法访问它的源代码 (2认同)
  • @gbaor:你可以使用没有同源限制的[JSONP](http://en.wikipedia.org/wiki/JSONP)或(如果服务器也不支持)你可以运行服务器端您自己的服务器上的脚本将从其他服务器请求数据并将其返回 - 然后您的JavaScript代码可以从您的服务器获取此数据,这些数据来自同一个源. (2认同)

Jav*_*tia 9

我从发送ajax内容的JavaScript代码中遇到了这个问题.

为了允许带有预检的跨源请求,我必须在收到请求的.ASPX中执行此操作:

//Check the petition Method
if (Request.HttpMethod == "OPTIONS")
{
    //In case of an OPTIONS, we allow the access to the origin of the petition
    string vlsOrigin = Request.Headers["ORIGIN"];
    Response.AddHeader("Access-Control-Allow-Origin", vlsOrigin);
    Response.AddHeader("Access-Control-Allow-Methods", "POST");
    Response.AddHeader("Access-Control-Allow-Headers", "accept, content-type");
    Response.AddHeader("Access-Control-Max-Age", "1728000");
}
Run Code Online (Sandbox Code Playgroud)

您必须小心并检查您的请求所要求的标题.我检查了那些使用Fiddler.

希望这能在将来为某人服务.


Sha*_*war 6

回答:

您的浏览器正在发起PreFlight OPTIONS请求。

为什么: 因为你的要求不是一个简单的要求

为什么这不是一个简单的请求: 因为“Content-Type”=“application/json”。

解决方案: 尝试使用以下内容类型之一:

  • 应用程序/x-www-form-urlencoded
  • 多部分/表单数据
  • 文本/纯文本