未针对CORS检查触发飞行前请求

时间:2018-12-24 12:22:32

标签: angularjs cors xmlhttprequest angular-http preflight

据我了解,如果以下任一条件为 false (来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests),浏览器就会发送飞行前请求:

  • 请求方法是GET,HEAD或POST。
  • 未设置自定义标题。
  • Content-Type标头值为application/x-www-form-urlencodedmultipart/form-datatext/plain

我有一个Web应用程序,该应用程序将GET请求发送到其他来源的服务器。由于必须将cookie发送到服务器,因此属性withCredentials设置为true。标头Content-Type设置为application/json。对于此请求,浏览器不会触发飞行前请求,但应这样做,因为第三个条件为假。这可能是什么原因?

与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
}

1 个答案:

答案 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)。