我正在测试一些csrf内容,我想知道是否可以使用Content-Type: application/json
来发布跨域ajax请求
每次我尝试使用jQuery执行此操作时:
$.ajax({
type: "post",
url: "http://someotherdomain.com/endpoint",
contentType: "application/json; charset=UTF-8",
data: {"a": "1"},
dataType: "json",
crossDomain: true,
success: function(data){ alert(data); },
failure: function(data){ alert(data); }
});
我始终发送 HTTP OPTIONS 请求而不是 HTTP POST 。
请注意 - 我不关心接收数据,我需要的是单向帖子。
请注意,内容类型不能是x-www-form-urlencoded
,也不能是GET请求。
答案 0 :(得分:4)
Content-Type: application/json
标头不是简单的标头,因此首先需要在实际请求之前进行预检请求。您看到的HTTP OPTIONS请求是预检请求。来自CORS规范(http://www.w3.org/TR/cors/):
如果标题字段名称是标题,则称标题是简单标题 Accept,Accept-Language或的ASCII不区分大小写的匹配项 内容 - 语言,或者如果它是ASCII不区分大小写的匹配 Content-Type和标题字段值媒体类型(不包括 参数)是ASCII的不区分大小写的匹配 application / x-www-form-urlencoded,multipart / form-data或text / plain。
为了通过预检请求,服务器需要使用以下标题响应OPTIONS请求:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT,POST,DELETE
Access-Control-Allow-Headers: Content-Type
一旦浏览器收到此响应,它将发出实际的HTTP POST请求。请注意,如果您的请求包含其他自定义标头,则需要将它们包含在Access-Control-Allow-Headers响应标头中。您可以在此处了解有关CORS预检请求的更多信息:
http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server
答案 1 :(得分:2)
如果您的浏览器支持所谓的跨源资源共享(CORS),并且all modern browsers,现在可以支持此功能。简而言之,服务器应该为您提供Access-Control-Allow-Origin
标题。
另外,正如你所说的那样,你并不打算将任何信息作为回应而烦恼,为什么不提交一些表格呢?