我正在尝试使用AJAX执行POST:
<script>
$(document).ready(function(){
$.ajax({
type: 'POST',
beforeSend: function(xhr) {xhr.setRequestHeader("x-csrf-token",'oECpabcdefco4DFY+LEbetabcdefgD0REBOzk=')},
crossDomain: true,
url: 'http://0.0.0.0:3040/users/gmail_permission/',
data: ({'gmail':'email@gmail.com','id':'49'}),
});
});
</script>
我收到错误
Request header field x-csrf-token is not allowed by Access-Control-Allow-Headers.
但是当我使用REST客户端(进行调试/测试)时,帖子没有问题。这是为什么?我看不出x-csrf-token是如何在REST客户端上出现问题但是我的AJAX POST出了问题?
答案 0 :(得分:0)
请参阅http://enable-cors.org作为有关CORS的良好资源。
跨源资源共享是服务器(在本例中为google)允许其他网站跨域发出请求的方式。例如,如果用户默认登录到其银行帐户,则您不希望任何网站向bank.com发出ajax GET请求并查看用户看到的内容。服务器使CORS成为一种优势,因此API是公共的,免费的。
但是,这些服务器(例如google api)只允许标题的子集通过。请参阅此处的文档:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Access-Control-Allow-Headers
谷歌在这种情况下已选择禁止&#34; x-csrf-token&#34;在基于浏览器的ajax调用中。
看起来这个API并不是要从客户端调用。此外,您在浏览器中向用户公开您的PRIVATE api密钥!别这么做!此API仅用于从服务器端调用。
编辑:我发现你实际上正在对你自己的服务器进行ajax调用,而不是直接对谷歌进行调用。您需要在服务器上启用x-csrf-token访问控制。在此列表中找到您正在使用的服务器,然后按照以下步骤操作:http://enable-cors.org/server.html
答案 1 :(得分:0)
在.htaccess中检查以允许标头中的X-CSRF-Token。像这样:
Header add Access-Control-Allow-Headers "origin, content-type,X-Requested-With, X-CSRF-Token"