Webkit浏览器不允许我设置CORS预检标头

Nic*_*ick 7 javascript jquery cors

我正在尝试使用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);
    }
});
Run Code Online (Sandbox Code Playgroud)

我期待这些标题导致浏览器创建一个与服务器协商的飞行前请求(OPTIONS).我知道我之前已经完成了这个.有人能告诉我我忘记了什么吗?

非常感谢!

dan*_*y74 1

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

但是,如果您发出跨域 POST 请求,浏览器将首先发出预检 OPTIONS 请求,而无需您指示它这样做。此请求的目的是查看服务器是否允许来自您客户端的域/IP 的跨域 POST 请求。

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

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

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