7

我正在尝试使用 jQuery.ajax() 创建一个跨源 GET 请求。我的服务器配置为接受此类请求。Chrome 不允许我发送标头:

访问控制请求方法

访问控制请求标头

拒绝设置不安全的标头“Access-Control-Request-Method”<-错误消息

这是我的ajax请求:

$.ajax({
    type:"GET",
    headers: {
        'Access-Control-Request-Method' : 'GET',
        'Access-Control-Request-Headers': 'X-Custom'
    },      
    url: "http://localhost:3000",       
    success: function(msg) {
        console.log(msg);
    }
});

我期望这些标头会导致浏览器创建飞行前请求(OPTIONS)以与服务器进行协商。我知道我以前已经做到了。有人能告诉我我忘记了什么吗?

非常感谢!

4

1 回答 1

1

如果请求不是简单请求,则 PREFLIGHT 选项请求会自动发生在跨域请求上。一个简单的请求通常是一个 GET 请求。因此,如果您发出跨域 GET 请求,则不会有预检 OPTIONS 请求。

但是,如果您发出跨域 POST 请求,浏览器将在没有您指示的情况下首先发出预检 OPTIONS 请求。此请求的目的是查看服务器是否允许来自您客户端的域/IP 的跨域 POST 请求。

如果您的服务器在响应中具有正确的“访问控制”标头,也就是说,是的,允许该客户端发出跨域 POST 请求,那么浏览器将继续发出 POST 请求。如果您的服务器拒绝(因为服务器上的“访问控制”标头错误),那么浏览器将尊重这一点并且不会发出第二个 POST 请求。

有关更多信息,请参阅https://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request

此外,您必须确保您的服务器设置为处理传入的 OPTIONS 请求。

于 2017-03-29T21:05:28.757 回答