Chrome中的AJAX发送OPTIONS而不是GET/POST/PUT/DELETE?

Cor*_*urn 102 ajax jquery cross-domain

我正在开发一个内部Web应用程序.在IE10中,请求工作正常,但在Chrome中,所有AJAX请求(有很多)都是使用OPTIONS发送的,而不是我给出的任何定义的方法.从技术上讲,我的请求是"跨域".该站点在localhost:6120上提供,我正在向AJAX请求的服务是在57124. 这个关闭的jquery错误定义了问题,但不是真正的修复.

如何在ajax请求中使用正确的http方法?

编辑:

这是在每个页面的文档加载中:

jQuery.support.cors = true;
Run Code Online (Sandbox Code Playgroud)

每个AJAX都是类似的:

var url = 'http://localhost:57124/My/Rest/Call';
$.ajax({
    url: url,
    dataType: "json",
    data: json,
    async: true,
    cache: false,
    timeout: 30000,
    headers: { "x-li-format": "json", "X-UserName": userName },
    success: function (data) {
        // my success stuff
    },
    error: function (request, status, error) {
        // my error stuff
    },
    type: "POST"
});
Run Code Online (Sandbox Code Playgroud)

Dar*_*con 133

Chrome正在预检查找CORS标头的请求.如果请求是可接受的,它将发送实际请求.如果您正在执行此跨域,您只需处理它,或者找到一种方法来使请求成为非跨域.这就是为什么jQuery bug被关闭为不能修复的原因.这是设计的.

与简单请求(如上所述)不同,"预检"请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以便确定实际请求是否可安全发送.跨站点请求是这样预检的,因为它们可能对用户数据有影响.特别是,如果出现以下情况,请求会被预检:

  • 它使用GET,HEAD或POST以外的方法.此外,如果POST用于发送具有除application/x-www-form-urlencoded,multipart/form-data或text/plain之外的Content-Type的请求数据,例如,如果POST请求将XML有效负载发送到服务器使用application/xml或text/xml,请求预检.
  • 它在请求中设置自定义标头(例如,请求使用诸如X-PINGOTHER之类的标头)

  • 自定义标题.这可能正是引发预检OPTIONS调用的原因. (19认同)

Dro*_*out 17

基于请求未在默认端口80/443上发送的事实,此Ajax调用自动被视为跨源资源(CORS)请求,换句话说,该请求自动发出OPTIONS请求,该请求检查服务器/ servlet端的CORS头.

即使你设置,也会发生这种情况

crossOrigin: false;
Run Code Online (Sandbox Code Playgroud)

或者即使你省略它.

原因很简单localhost != localhost:57124.尝试仅将其发送到localhost没有端口 - 它将失败,因为请求的目标将无法访问,但请注意,如果域名相等,则在POST之前没有OPTIONS请求的情况下发送请求.