5

我必须从我的网站向第三方域/服务器进行网络服务调用。当我使用 jQuery Ajax by Post 方法和 content-type:text/plain 进行此调用时,它工作正常。

但是,当我将其更改为 content-type: text/xml 时,它正在抛出:

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

即使它设置在第三方服务器上以允许访问我们的网站。我们在使用 content-type:text/plain 进行调用时得到了这个标题。

我们还在第三方服务器上添加了以下内容。

Access-Control-Allow-Methods : Get , Post , Options ,PUT

Access-Control-Allow-Headers: Authorization,origin, content-type, accept

请让我知道飞行前请求没有得到“Access-Control-Allow-Origin”响应的原因可能是什么?

4

2 回答 2

1

您的脚本适用于 text/plain 的原因是因为它是一个简单的请求。如果您查看此答案,您会发现您的 text/plain 请求符合简单请求的要求。但是,当您将内容类型更改为 text/xml 时,它会将其更改为“非简单”请求。

为了使您的“非简单”请求生效,您需要了解如何提出飞行前请求。该网站在“处理不那么简单的请求”下解释了如何做到这一点。

更新

只是一个注意:Access-Control-Allow-Methods是强制转换敏感的(全部大写),您不需要列出用于简单请求(GET、HEAD、POST)的任何方法。-来源

Access-Control-Allow-Methods: OPTIONS, PUT
Access-Control-Allow-Headers: Authorization, Origin, Content-Type, Accept

Firefox 在同源请求中不包含 Origin 标头。但是 Chrome 和 Safari 在同源 POST/PUT/DELETE 请求中包含 Origin 标头(同源 GET 请求将没有 Origin 标头)。

有没有可能起源相同?

你的缓存可能有问题吗?

确保您的 jquery ajax 调用具有以下设置:

crossDomain: true // Will force a cross domain request
cache: false
于 2016-04-04T16:34:28.303 回答
0

content-type:text/plain和之间的区别content-type: text/xml是:“text/xml”需要“preflight”,但“text/plain”不需要。

来自MDN

特别是,在以下情况下会预检请求:

它使用 GET、HEAD 或 POST 以外的方法。此外,如果 POST 用于发送 Content-Type 不是 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 的请求数据,例如,如果 POST 请求向服务器发送 XML 有效负载使用 application/xml 或 text/xml,然后预检请求。

一些可能导致预检请求失败的潜在原因:

  1. 服务器未启用 CORS。搜索如何为您的服务器技术启用 CORS。
  2. 服务器不使用“文本/纯文本”以外的请求。例如; Spring 有一个consume 选项,它定义了可接受的内容类型。
  3. 您的帖子中有一个“授权”标题。如果您发送带有凭据的请求,您还应该添加Access-Control-Allow-Credentials: true标头。再次来自MDN
于 2016-04-10T21:13:12.547 回答