2

我正在测试一些 csrf 的东西,我想知道是否可以使用 POST 跨域 ajax 请求Content-Type: application/json

每次我尝试使用 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 POSTs

注意-我不关心接收数据,我只需要一个单向的帖子。

注意 - 内容类型不能x-www-form-urlencoded也不能是 GET 请求。

4

2 回答 2

4

Content-Type: application/json头不是一个简单的标头,因此在实际请求之前首先需要一个预检请求。您看到的 HTTP OPTIONS 请求是预检请求。来自 CORS 规范(http://www.w3.org/TR/cors/):

如果标头字段名称是 Accept、Accept-Language 或 Content-Language 的 ASCII 不区分大小写匹配,或者它是 Content-Type 和标头的 ASCII 不区分大小写匹配,则称标头为简单标头字段值媒体类型(不包括参数)是对 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 的不区分大小写的 ASCII 匹配。

为了通过预检请求,服务器需要使用以下标头响应 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

于 2012-08-26T18:54:51.340 回答
2

如果您的浏览器支持所谓的跨域资源共享 ( CORS ),并且所有现代浏览器现在都支持此功能,则它是可能的。简而言之,服务器应该为您提供Access-Control-Allow-Origin标头。

此外,正如您所说,您不必费心获取任何信息作为回复,您为什么不提交一些表格?

于 2012-08-26T18:31:22.110 回答