我正在尝试使用jQuery.ajax()创建一个跨源GET请求.我的服务器配置为接受此类请求. Chrome不允许我发送标题:
Access-Control-Request-Method
Access-Control-Request-Headers
Refused to set unsafe header “Access-Control-Request-Method” <- error
message
这是我的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).我知道我之前已经完成了这个.有人能告诉我我忘记了什么吗?
非常感谢!
解决方法
如果请求不是简单请求,则会在跨域请求上自动发生PREFLIGHT选项请求.简单的请求通常是GET请求.因此,如果您进行跨域GET请求,则不会有预检OPTIONS请求.
但是,如果您发出跨域POST请求,浏览器将在没有您指示的情况下执行此操作,首先进行预检OPTIONS请求.此请求的目的是查看服务器是否允许来自客户端域/ IP的跨域POST请求.
如果您的服务器在响应中具有正确的“访问控制”标头,也就是说,允许此客户端发出跨域POST请求,则浏览器将继续发出POST请求.如果您的服务器显示NO(因为服务器上的“Access-Control”标头错误),那么浏览器将尊重该服务器,并且不会发出第二个POST请求.
有关详细信息,请参阅https://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request.
此外,您必须确保您的服务器设置为处理传入的OPTIONS请求.