Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery CORS内容类型选项_Jquery_Ajax_Cors - Fatal编程技术网

jQuery CORS内容类型选项

jQuery CORS内容类型选项,jquery,ajax,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:

我对使用带有自定义内容类型的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
});
我需要将内容类型设置为“application/json”,因为它需要服务器端。但不是通过POST发送请求 jQuery将其作为选项发送

这里有一个标题:

响应标题:

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
请求标头:

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工作得很好,所有必需的头都是由服务器发送的,但如果它是按选项类型发送的,则不是这样。 这是jQuery的问题吗


jQuery-1.8.1

此选项请求是CORS飞行前请求。它是在实际请求之前发送到服务器的请求,以便请求权限以发出请求。自定义内容类型实际上正在触发预飞行。根据CORS规范(),除application/x-www-form-urlencoded、multipart/form数据或text/plain之外的任何内容类型都会触发预飞行

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

如果您确实可以控制远程服务器,则可以将其更改为处理预飞行。为了处理飞行前请求,您应该在对选项请求的响应中发送以下标题:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Content-Type
响应应该是HTTP 200。
Access Control Allow Methods
响应头可以响应
Access Control Request Method
的值,也可以是
GET、POST、PUT、DELETE
,以支持所有方法。
访问控制允许标头
响应标头应回显
访问控制请求标头
请求标头中的值

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


谢谢你。是天意。允许标题的问题是什么让我。但除了你发布的代码外,你的解释还帮我点燃了电灯泡,让我明白如何让一切正常运转。谢谢它对我不起作用:/I我只是在servlet中完全这样做filter@monsur顺便说一句,到底是什么让你对CORS如此感兴趣,以至于写了一本书?(中唯一一本关于CORS的书。)不应该
OPTIONS
返回
204 No Content
响应吗?如果您的服务器是
Python
Flask
应用程序,那么您可以返回
应用程序。在
OPTIONS
方法上设置默认的\u OPTIONS\u response()