AngularJS $ http POST withCredentials失败,请求正文中包含数据

Ami*_*mak 2 rest session-cookies cors preflight angularjs-http

AngularJS使用REST对服务器端进行身份验证,并获取JSESSIONID cookie.在下一步中,我尝试使用REST从服务器端获取一些JSON数据以及在上一步中获得的会话cookie.这是客户端代码:

getSomeJSONDataFromServer:function() {
var deferred = $q.defer();
$http({
    method: 'POST',
    withCredentials: true,
    url: "http://domain.name/app/someURL",
    headers:{
        'Accept':'application/json',
        'Content-Type':'application/json; charset=utf-8',
        'Access-Control-Request-Headers': 'X-Requested-With, content-type, accept, origin, withcredentials'
    }
})
.success(function(data, status, headers, config) {
    // handle data
})
.error(function(data, status, headers, config) {
    // handle error
});
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常:

没有正文的CORS $ http请求

当我在上面的POST请求体中发送一些数据时,问题就开始了.

...
$http({
    method: 'POST',
    withCredentials: true,
    url: "http://domain.name/app/someURL",
    headers:{
        'Accept':'application/json',
        'Content-Type':'application/json; charset=utf-8',
        'Access-Control-Request-Headers': 'X-Requested-With, content-type, accept, origin, withcredentials'
    },
    data: '{}'
})
.success(...
Run Code Online (Sandbox Code Playgroud)

上述代码在prelight请求中失败:

CORS $ http请求与身体失败!

看起来服务器启动一个新会话,因为会话cookie由于某种原因没有发送.无论如何,我觉得我错过了一些非常简单的东西,一些标题或类似的东西...任何想法都很感激.提前致谢.

小智 7

阿米尔,

请允许我帮助您和其他人清楚地了解处理CORS时的预期,例如:

指数:

  • 简单的CORS版本
  • 预检CORS版本
  • 使用凭据的请求

简单的CORS版本

  1. 你可以使用GET,HEAD或POST:
    • 在任何方法案例中,您都无法设置自定义标头.
    • 您始终可以通过Access-Control-Allow-Origin标头让服务器端限制域访问.
  2. 如果POST有请求数据:
    • 内容类型必须是以下任何一种:
      • 应用程序/ x-WWW窗体-urlencoded
      • 多部分/格式数据
      • text/html的

这个SIMPLE版本显然不是你的情况......

预检CORS版本

  1. 你可以使用GET,HEAD或POST:
    • 在任何方法的情况下,你的CAN设置自定义标头.
    • 您始终可以通过Access-Control-Allow-Origin标头让服务器端限制域访问.
  2. 如果POST有请求数据:
    • 内容类型可能如下:
      • 应用程序/ x-WWW窗体-urlencoded
      • 多部分/格式数据
      • text/html的
    • 内容类型也可以其他类型:
      • 应用程序/ JSON
      • 应用程序/ XML
      • 文/ XML
      • 等等

这个PREFLIGHTED版本显然是你的情况......

使用凭据的请求

  1. 如果您使用cookie调用调用,则需要在请求中设置以下参数:
    • withCredentials = true

凭证明确的请求也是您的理由......