jQuery CORS 内容类型选项

标签 jquery ajax cors

我在使用带有自定义内容类型的 jQuery CORS 发送 AJAX 正文请求时遇到问题。 这是我的代码:

$.ajax({
  url: "http://some-other-domain/my-path",
  type: "POST",
  contentType: "application/json",
  dataType: "json",
  data: JSON.stringify({
    key: 1,
    key2: 2
  }),
  statusCode: {
    200: function(data) {
    }
  },
  xhrFields: {
    withCredentials: true
  },
  crossDomain: true
});

我需要将 Content-type 设置为“application/json”,因为它需要服务器端。但不是以 POST 方式发送请求 jQuery 将其作为选项发送。

这是一个标题:

响应 header :

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 03:00:00 EET
Set-Cookie: JSESSIONID=BB9D6783E58FB0F2ADE1924A2F0CBA52; Path=/
Content-Type: text/html;charset=UTF-8
Content-Length: 6233
Date: Fri, 07 Sep 2012 14:41:13 GMT

请求 header :

OPTIONS /my-path HTTP/1.1
Host: MY-HOME-NAME
User-Agent: MY_USER_AGEMT
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: HERE-GOES-DOMAIN
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache

CORS 效果很好,所有必需的 header 均由服务器发送,但如果通过 OPTIONS 类型发送则不然。 是 jQuery 问题吗?

jQuery - 1.8.1

最佳答案

此 OPTIONS 请求是 CORS 预检请求。它是在实际请求之前发送到服务器的请求,以请求发出请求的权限。自定义内容类型实际上触发了预检。根据 CORS 规范 ( http://www.w3.org/TR/cors/ ),除 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 之外的任何 Content-Type 都会触发预检。 p>

如果您无法控制远程服务器,那么您需要要求他们支持 CORS 预检,或者尝试其他选项,例如 JSON-P。

如果您确实可以控制远程服务器,则可以将其更改为处理预检。为了处理预检请求,您应该在 OPTIONS 请求的响应中发送以下 header :

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Content-Type

响应应该是 HTTP 200。Access-Control-Allow-Methods 响应 header 可以回显 Access-Control-Request-Method 的值,或者它可以只是 GET、POST、PUT、DELETE 以支持所有方法。 Access-Control-Allow-Headers 响应 header 应回显 Access-Control-Request-Headers 请求 header 中的值。

一旦浏览器收到这些 header ,它将发出实际的请求。您可以在此处了解有关 CORS 预检请求的更多信息:

http://www.html5rocks.com/en/tutorials/cors/

关于jQuery CORS 内容类型选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12320467/

相关文章:

javascript - Ajax:从不同域加载XML?

php - 上传Codeigniter Ajax文件时出错

c# - HTTP 代码 405(不允许的方法),当我在 ASP.NET WebAPI CORS 中发送 POST 数据时

javascript - 返回 false 在 jQuery ajax 中不起作用

Jquery - 将 Ajax jSON 响应存储为变量

javascript - 来自 ajax 加载的 div 的 jQuery 帖子

javascript - 为什么我的 JavaScript 会抛出““No ' Access-Control-Allow-Origin' header is present on the requested resources”错误,而 Postman 却没有?

javascript - 从 Rails 设置 document.domain 的 DRY 方式

javascript - 如何在 Highcharts PIE 数据中添加自定义颜色 |切片并想更改切片文本

jquery - 如何使用 CSS 编辑 jQuery 表格