【发布时间】:2019-05-23 14:46:59
【问题描述】:
据我了解,如果以下任一条件为 false(来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests),则浏览器会发送飞行前请求:
- 请求方法是 GET、HEAD 或 POST。
- 未设置自定义标题。
- Content-Type 标头值为
application/x-www-form-urlencoded、multipart/form-data或text/plain。
我有一个网络应用程序,它向不同来源的服务器发送 GET 请求。由于我必须将 cookie 发送到服务器,因此属性 withCredentials 设置为 true。标头Content-Type 设置为application/json。对于这个请求,浏览器不会触发 pre-flight 请求,但它应该是因为第三个条件为 false。这背后的原因可能是什么?是否与 GET 请求的 Content-Type 标头无关紧要(因为没有请求正文)?
编辑:添加请求代码:
configObject = {
'withCredentials': true,
headers: {
'Content-Type': 'application/json'
}
};
function getRequest(url, dict) {
$http.get(url, Object.assign({}, configObject)).success(function(result) {
// on success
}).error(function(err) {
// on error
});
// return
}
【问题讨论】:
-
如果您想在这里获得其他人的见解,您需要发布您的请求代码 - 因为听起来您的实际代码没有按照问题中的描述进行操作。如果代码正在发起一个跨域请求,并且发出请求的代码实际上是将 Content-Type 标头设置为 application/json,那么这绝对会触发浏览器执行预检。总是。
-
@sideshowbarker 我怀疑标题是否真的被设置了。当我检查请求时(在浏览器的网络选项卡中),请求标头中不存在此标头。现在添加代码。
-
是的,我不确定为什么代码使用 'Object.assign({}, configObject)' 作为该 .get 调用的第二个参数,而不仅仅是 'configObject',但我猜您可能只想使用“$http.get(url, configObject)”来尝试它。如果这不会导致标题按预期设置,那么我真的不知道。就个人而言,我建议只使用标准的 fetch 方法......
-
@sideshowbarker 这确实是问题所在。在没有请求正文的情况下,Angular 正在删除此标头。您可以将此作为答案发布吗?
标签: angularjs cors xmlhttprequest angular-http preflight