AngularJS withCredentials未发送

Dev*_*xon 5 javascript php ajax cors angularjs

在AngularJS中,我在子域中使用了Restful API但是我遇到的问题是cookie /会话没有跨域共享.对于Angular,我这样做:

app.config(['$httpProvider',
function($httpProvider) {
    $httpProvider.defaults.useXDomain = true;
    $httpProvider.defaults.withCredentials = true;
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
}]);
Run Code Online (Sandbox Code Playgroud)

此外,当我用$ http发出请求时,我正在做

var object = {};

object.url = '/example'
object.withCredentials = true;

$http(object).success(object.success).error(object.error);
Run Code Online (Sandbox Code Playgroud)

在我的服务器端,我有:

if($_SERVER['REQUEST_METHOD']=='OPTIONS') {
    if(isset($_SERVER['HTTP_X_FOWARDED_HOST']) && !empty($_SERVER['HTTP_X_FOWARDED_HOST'])) {
        $origin=$_SERVER['HTTP_X_FOWARDED_HOST'];
    } else {
        $origin=$_SERVER['HTTP_ORIGIN'];
    }
    if(isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) && ($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']=='POST' || $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']=='DELETE' || $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']=='PUT')) {
        header('Access-Control-Allow-Origin: '.$origin);
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Allow-Headers:  *,X-Requested-With,Content-Type');
        //header('Access-Control-Allow-Headers: Content-Type');
        header('Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT');
        // http://stackoverflow.com/a/7605119/578667
        header('Access-Control-Max-Age: 86400');
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我看到服务器说它将允许凭据但不在选项请求中发送.截图如下.

在此输入图像描述 我究竟做错了什么?

Geo*_*enz 11

默认情况下,凭证不会在CORS飞行前OPTIONS请求中发送.看到这里.另见这个答案.凭证将根据您的实际请求发送.

此外,useXDomain和X-Request-With标头实际上并未在当前版本的angular中使用,因此这些行在$ httpProvider配置中不执行任何操作.所有CORS交互都由浏览器本身和您的服务器处理.

通常,要正确实现CORS,您的服务器不应要求预检请求上的凭据.(请注意,有些浏览器仍会发送它们,但不应该.)这是因为OPTIONS请求被认为是"安全的",并且绝不应包含任何机密信息.

可能是您的问题在于您尝试跨域共享的Cookie.你想把什么饼干发送到哪里?