是否有可能使application / json的跨域POST ajax请求?

时间:2012-08-26 18:25:29

标签: jquery http cross-domain csrf cors

我正在测试一些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请求。

2 个答案:

答案 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标题。

另外,正如你所说的那样,你并不打算将任何信息作为回应而烦恼,为什么不提交一些表格呢?