Javascript XMLHttpRequest更改POST to选项

Javascript XMLHttpRequest更改POST to选项,javascript,xmlhttprequest,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

我有以下代码:

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));
执行发送时,我有以下日志:

OPTIONS http://localhost:8111/ [HTTP/1.1 405 Method Not Allowed 74ms]
在localhost:8111中,我有一个接受post的reslet服务器资源,这是同源策略的问题吗?我已经修改了restlet以放置allow-origin头,并使用另一个GET-http请求(在jquery中)对其进行了测试,结果正常。我有相同来源的问题,因为我使用html5浏览器,我的服务器在响应中放置了标题,那么为什么发送会显示此错误?为什么要为选项更改帖子? 谢谢

可能重复?:我认为没有,但这是真的,问题在于 这两个问题都一样,但我的问题是指 浏览器有问题,另一个问题首先指向 jquery。根据经验,时间不算作重复,而 答案是不同的,但两个问题都是互补的 彼此

是的,这是“同一原产地政策的问题”。您正在向其他服务器或其他端口发出请求,这意味着这是一个跨站点HTTP请求。以下是对此类请求的看法:

此外,对于HTTP请求方法,可能会对 服务器的数据(特别是对于HTTP方法而不是
GET
,或
POST
使用某些MIME类型),规范要求 浏览器“预飞”请求,从 使用HTTP
OPTIONS
请求方法的服务器,然后 来自服务器的“批准”,将实际请求与实际请求一起发送 HTTP请求方法


在(“带飞行前的交叉来源请求”部分)中有更详细的描述。服务器需要允许
选项
请求并发送带有
访问控制允许来源
访问控制允许标头
访问控制允许方法
标头的响应,以允许请求。然后浏览器将发出实际的
POST
请求。

我正是因为一个发送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");
}
你必须小心,检查你的请愿书的标题是什么。我用小提琴检查了一下


希望这能为将来的某个人服务。

正如其他人所指出的,这是CORS的事情

这是如何在NGINX中处理它(基于):

如果要允许来自任何来源的CORS请求,请替换

add_header Access-Control-Allow-Origin "http://example.com";

如果不使用授权,则不需要此位:

add_header Access-Control-Allow-Headers "Authorization";
add_header Access-Control-Allow-Credentials "true";

对于我正在开发的API,我需要将3种请求方法列为白名单:GET、POST和OPTIONS,以及
X-App-Id
头,这就是我最终要做的:

if ($request_method = OPTIONS ) {
    add_header Access-Control-Allow-Origin "*";
    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
    add_header Access-Control-Allow-Headers "X-App-Id";
    add_header Content-Length 0;
    add_header Content-Type text/plain;
    return 200;
}

回答:

您的浏览器正在启动请求

原因: 因为你的请求不是一个好消息

为什么它不是一个简单的请求: 因为“内容类型”=“应用程序/json”

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

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

如果无法修改服务器的行为,我该怎么办?我无法访问它的来源code@gbaor:您可以使用没有相同来源限制的,或(如果服务器也不支持)您可以在自己的服务器上运行一个服务器端脚本,该脚本将从另一台服务器请求数据并返回数据-然后您的JavaScript代码可以从相同来源的服务器获取该数据
add_header Access-Control-Allow-Headers "Authorization";
add_header Access-Control-Allow-Credentials "true";
if ($request_method = OPTIONS ) {
    add_header Access-Control-Allow-Origin "*";
    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
    add_header Access-Control-Allow-Headers "X-App-Id";
    add_header Content-Length 0;
    add_header Content-Type text/plain;
    return 200;
}