当前位置: 首页 > 知识库问答 >
问题:

CORS:在GET上没有飞行前准备,但在POST上有飞行前准备

赵刚豪
2023-03-14

我正在尝试删除应用程序中不必要的飞行前请求。为此,我简化了请求的一些部分,删除了自定义头等,但遇到了一个问题-GET请求现在可以在没有预飞行的情况下正常工作,但POST请求仍然存在。

我遵循了以下要求:

  1. 请求未设置自定义HTTP头
  2. 内容类型为“文本/纯文本;字符集=utf-8”
  3. 请求方法必须是GET、HEAD或POST之一。如果是POST,内容类型应为application/x-www-form-urlencoded、multipart/form-data或text/plain之一

GET和POST请求都通过一个httpinvoke调用。

例如,GET请求不是以飞行前开始的:

URL:<代码>http://mydomain/APIEndpoint/GETRequest?Id=346089

请求方法:获取

请求标题:

接受:*/*

接受编码:gzip,deflate

接受-语言:uk-U A, uk; q=0.8, ru; q=0.6, en-US; q=0.4, en; q=0.2

缓存-控制:无-缓存

连接:保持活动

内容类型:文本/纯文本;字符集=utf-8

主机:正确的主机

来源:< code>http://localhost

Pragma:没有缓存

推荐人:正确的推荐人

User-Agent: Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36

查询字符串参数:

Id=346089

令牌=f5h345

还有一个POST请求,看起来非常相似,但仍以飞行前为开头:

网址: http://mydomain/APIEndpoint/GETRequest?param=TEST

申请方式:邮寄

请求标题:

接受:*/*

接受编码:gzip,deflate

接受-语言:uk-U A, uk; q=0.8, ru; q=0.6, en-US; q=0.4, en; q=0.2

缓存-控制:无-缓存

连接:保持活动

内容长度:11

内容类型:文本/纯文本;字符集=UTF-8

主持人:

来源:< code>http://localhost

Pragma:没有缓存

推荐人:用户代理:Mozilla/5.0(Windows NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome /60.0.3112.90Safari /537.36

查询字符串参数:

参数:测试

请求有效载荷

{MyData: {}}

任何建议将不胜感激!谢谢!

==== 更新 ===

根据要求,发布POST请求的飞行前请求:

网址: http://mydomain/APIEndpoint/GETRequest?param=TEST

请求方法:选项

状态代码:200正常

响应标头

访问控制允许来源:*

缓存-控制:无-缓存

内容-长度:0

日期: Wed,09 Aug 2017 08:02:16 GMT

过期:-1

Pragma:没有缓存

服务器:Microsoft-I IS/8.5

x-AspNet-版本:4.0.30319

X-Powered-by:ASP.NET

请求标题

接受:*/*

接受编码:gzip,deflate

接受-语言:uk-U A, uk; q=0.8, ru; q=0.6, en-US; q=0.4, en; q=0.2

访问-控制-请求-方法:POST

缓存-控制:无-缓存

连接:保持活动

主持人:正确的主持人

来源:< code>http://localhost

Pragma:没有缓存

推荐人:正确的推荐人

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/60.0.3112.90 Safari/537.36

查询字符串参数

参数:测试

它是使用httpinvoke库的遗留代码。实际执行调用的代码片段:

_converters: {
    'text json': function (input, reviver) {},
    'json text': JSON.stringify
};

headers = {
    'Content-Type': 'text/plain; charset=utf-8'
};

data = {params: "test"};

httpinvoke(url, method.toUpperCase(), {
    corsExposedHeaders: ['Content-Type'],
    headers: headers,
    input: data,
    converters: _converters,                
    inputType: 'json',
    outputType: 'json',
    timeout: self._getMessageTimeout()
}).then(function (res) {}, function (error) {});

共有2个答案

羊舌成周
2023-03-14

正如@Anne提到POST发送预检请求的原因,尽管请求本身符合“简单请求”的规则(因此不需要预检)的原因在XMLHttpRequestUpload事件侦听器中。

XMLHttpRequestUpload本身可能不会在代码中提及,但您始终可以在xhr.upload变量中找到它。http-invoke库就是这种情况。

看起来完全无辜的代码是这样的:

< code > xhr . upload . on progress = onuploadpress;

实际上会导致强制性的飞行前请求。

感谢所有帮助解决这个问题的人。

郎翔
2023-03-14

如果在 XMLHttpRequestUpload 对象上注册了事件侦听器(这会强制进行预检;请参阅 https://xhr.spec.whatwg.org/ 中有关 use-CORS-preflight 标志的说明,以及 https://fetch.spec.whatwg.org/ 中的相关注释以及 MDN CORS 文章中有关 CORS 预检请求的更新文档),则可能会发生这种情况。

httpinvoke是这样做的吗?

 类似资料:
  • 在调试我遇到的CORS问题时,我发现了以下行为。Chrome发出以下选项预检请求(由Chrome本身在CURL中重写): 以下情况下服务器对此请求的响应: 是响应“无效CORS请求”的主体。如果我重复该请求,删除标头“Access Control request Method”(仅该标头),则OPTIONS请求将成功,并得到以下响应: 然而,有问题的头是CORS规范标准头,所以它不应该阻止请求成功

  • 我正在构建一个Angular 2应用程序与一个Spring Boot后端。我试图解决CORS预飞行几天的问题。根据本主题,它应该像这样与CORS过滤器一起工作: 角形前端: 我尝试了其他配置,这是我在这个和其他来源的Spring文档中找到的。

  • 问题内容: 我现在奋斗了几个小时。我想向另一个域发出简单的Ajax请求,但始终出现http 401错误: 我在服务器端设置了所有相关的CORS标头。这是网络流量: 我知道有很多关于此主题的文章,但似乎我缺少一些简单的东西。有人可以帮我吗? 问题答案: 更新 看起来我不对。标头从不发送请求。 -你需要确保你的服务器不响应到请求。 我不知道您的服务器用什么语言编写,但是您以错误的方式实现了授权-应该从

  • 我试图在本地构建一个用PHP REST框架作为我的api的Ember应用程序。Ember应用程序在提供,而api只在提供。这导致了一个CORS问题。我已经尝试了我能想到的一切,但我不断得到一个错误返回,说请求被阻止,飞行前通道没有成功。它在Firefox或Chrome上都不成功。 我已经将以下内容添加到API的文件中: 有什么想法或解决办法吗?任何帮助都很感激。谢了!

  • 我使用AJAX请求通过POST将数据发送到另一个域。因为我的内容类型不是标准的(它是JSON格式),所以需要一个飞行前请求。(使用请求方法:选项) 如维基百科跨域XHR调用图表中所述 我想知道这是否很费时,因为浏览器将必须到达服务器两次或不?也许这取决于每个浏览器的行为? 通过使用内容类型“纯文本”来避免飞行前请求,我是否获得了一些时间?

  • 我有一个配置为使用WINDOWS AUTHENTICATION的webapi。 在我的angular应用程序中,我有以下方法: 让方法完美地工作。 POST方法给了我以下错误: 最后介绍了webapi方法 还有我们几个小时来一直在努力的那个该死的错误: 无法加载XMLHttpRequesthttp://a.b.com/api/Contactos.对飞行前请求的响应未通过访问控制检查:请求的资源上不