据我了解,如果以下任一条件为 false (来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests),浏览器就会发送飞行前请求:
application/x-www-form-urlencoded
,multipart/form-data
或text/plain
。我有一个Web应用程序,该应用程序将GET请求发送到其他来源的服务器。由于必须将cookie发送到服务器,因此属性withCredentials
设置为true
。标头Content-Type
设置为application/json
。对于此请求,浏览器不会触发飞行前请求,但应这样做,因为第三个条件为假。这可能是什么原因?
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
}
答案 0 :(得分:1)
如果您的前端代码正在发起跨域请求,而发出请求的代码实际上将Content-Type
标头设置为application/json
,则绝对会触发浏览器进行预检。总是。
因此,这意味着,在该问题中,未触发浏览器进行预检是因为实际上并未将标头添加到浏览器最终发送的请求中。
但是问题中描述的特殊情况是……奇怪–因为它试图向{em> Content-Type
请求和GET
添加GET
标头问题中的请求(几乎与所有其他GET
请求一样)没有请求正文。
因此,在这种情况下,原因是Angular在进行$http
调用时会自动执行某种可以说是很聪明的操作(如果是意外的话):如果没有请求正文,它将删除{ {1}}来自请求的标头-这很有道理,因为如果没有请求主体,则不需要标头指定其媒体类型。
请在 Angular, content type is not being sent with $http 上查看已接受的答案,以确认该内容。
因此,如果由于某种原因您确实需要在没有请求主体的请求中包含Content-Type
头,那么解决方案是根本不使用Angular的Content-Type
,而是使用(例如,标准Fetch API),即使没有请求正文的请求也可以包含$http
,或者(如果您还需要使用Angular的Content-Type
来传递)一个空的请求正文,作为$http
请求的一部分(通过在请求中添加$http
)。