jquery为什么我的JavaScript代码收到“No'AccessControlAllowOrigin'头出现在请求的资源上”错误,而Postman没有?
Mod note: This question is about why
XMLHttpRequest
/fetch
/etc. on the browser are subject to the Same Access Policy restrictions (you get errors mentioning CORB or CORS) while Postman is not. This question is not about how to fix a "No 'Access-Control-Allow-Origin'..." error. It's about why they happen.
Please stop posting:
- CORS configurations for every language/framework under the sun. Instead find your relevant language/framework's question.
- 3rd party services that allow a request to circumvent CORS
- Command line options for turning off CORS for various browsers
我试图通过连接到内置的RESTful{a3}{a4}来使用JavaScript进行授权。但是,当我发出请求时,我得到以下错误:
XMLHttpRequest cannot load http://myApiUrl/login. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
我知道API或远程资源必须设置头,但是当我通过Chrome扩展Postman发出请求时,为什么它能工作呢
这是请求代码:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
# 1 楼答案
出现错误的原因是CORS标准,该标准对JavaScript如何执行ajax请求设置了一些限制
CORS标准是在浏览器中实现的客户端标准。因此,阻止呼叫完成并生成错误消息的是浏览器,而不是服务器
Postman没有实现CORS限制,这就是为什么当从Postman发出相同的呼叫时,您不会看到相同的错误
为什么邮递员不实施CORS?CORS定义了与发起请求的页面的来源(URL域)相关的限制。但在Postman中,请求并不来自带有URL的页面,因此CORS不适用
# 2 楼答案
如果您使用PHP,那么解决这个问题非常简单。只需在处理请求的PHP页面的开头添加以下脚本:
如果使用Node-red,则必须通过取消注释以下行,在
node-red/settings.js
文件中允许CORS:如果您使用的是与问题相同的Flask;您必须首先安装
flask-cors
然后将烧瓶COR包括在您的应用程序中
一个简单的应用程序如下所示:
有关更多详细信息,请查看Flask documentation
# 3 楼答案
在下面作为API的调查中,我使用了http://example.com而不是您问题中的http://myApiUrl/login,因为第一个有效
我假设您的页面位于http://my-site.local:8088.
您看到不同结果的原因是邮递员:
Host=example.com
(您的API)Origin
这类似于浏览器在站点和API具有相同域时发送请求的方式(浏览器也设置了头项
Referer=http://my-site.local:8088
,但我在Postman中没有看到)当Origin
头未设置时,通常默认情况下服务器允许此类请求强>这是邮递员发送请求的标准方式。但是当您的站点和API具有不同的域时,浏览器会以不同的方式发送请求,然后发生CORS,浏览器会自动:
Host=example.com
(您的作为API)Origin=http://my-site.local:8088
(您的站点)(头
Referer
的值与Origin
的值相同)。现在在Chrome的控制台&;网络选项卡您将看到:当您有
Host != Origin
时,这是CORS,当服务器检测到这样的请求时,通常默认情况下会阻止它Origin=null
是在从本地目录打开HTML内容时设置的,它会发送一个请求。同样的情况是,当您在<iframe>
内发送请求时,如下面的代码段中所示(但这里根本没有设置Host
头)-一般来说,只要HTML规范说源代码不透明,您就可以将其转换为Origin=null
。关于这方面的更多信息,您可以找到here如果您不使用简单的CORS请求,通常浏览器在发送主请求之前也会自动发送一个选项请求-详细信息如下here。下面的代码片段显示了这一点: