我必须从我的网站向第三方域/服务器进行web服务调用。当我使用内容类型为text/plain的jQueryAjax by Post方法进行此调用时,它运行良好。
但是,当我将其更改为内容类型:text/xml时,它正在抛出:
对飞行前请求的响应未通过访问控制检查:否请求的上存在"Access Control Allow Origin"标头资源
甚至它设置在第三方服务器上,允许访问我们的网站。我们在进行内容类型为text/plain的调用时得到了这个标头。
我们还在第三方服务器上添加了以下内容。
Access-Control-Allow-Methods : Get , Post , Options ,PUT
Access-Control-Allow-Headers: Authorization,origin, content-type, accept
请让我知道飞行前请求没有得到"访问控制允许来源"响应的原因是什么?
脚本之所以适用于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
content-type:text/plain
和content-type: text/xml
之间的区别在于:"text/xml"需要"preflight",而"text/plain"不需要。
来自MDN:
特别是,如果出现以下情况,请求将被预触发:
它使用GET、HEAD或POST以外的方法。此外,如果使用POST发送内容类型不是的请求数据application/x-www-form-urlencoded、multipart/form-data或text/plain,例如,如果POST请求使用application/xml或text/xml,则该请求将被预先触发。
可能导致飞行前请求失败的一些潜在原因:
- 服务器未启用CORS。搜索如何为您的服务器技术启用CORS
- 服务器不使用"text/plain"以外的请求。例如Spring有一个consume选项,用于定义可接受的内容类型
- 你的帖子中有一个"授权"的标题。如果使用凭据发送请求,则还应添加
Access-Control-Allow-Credentials: true
标头。再次来自MDN