Angularjs 角度1.5 CORS

Angularjs 角度1.5 CORS,angularjs,cors,Angularjs,Cors,我有一个angular js客户端,它向服务器发出请求。我的http提供程序(at)代码如下所示: angular.config(['$httpProvider', function ($httpProvider) { // Reset headers to avoid OPTIONS request: $httpProvider.defaults.headers.common = {}; $httpProvider.defaults.headers.post =

我有一个angular js客户端,它向服务器发出请求。我的http提供程序(at)代码如下所示:

angular.config(['$httpProvider', function ($httpProvider) {
    // Reset headers to avoid OPTIONS request:
    $httpProvider.defaults.headers.common  = {};
    $httpProvider.defaults.headers.post    = {};
    $httpProvider.defaults.headers.put     = {};
    $httpProvider.defaults.headers.patch   = {};
    $httpProvider.defaults.withCredentials = true;
}]);
# Set response headers so that we can send cross-domain requests
$self->res->headers->header('Access-Control-Allow-Origin'      => $self->req->headers->header('origin'));
$self->res->headers->header('Access-Control-Allow-Credentials' => 'true');
$self->res->headers->header('Access-Control-Allow-Methods'     => 'GET, POST, OPTIONS');
$self->res->headers->header('Access-Control-Allow-Headers'     => 'Content-Type, X-CSRF-Token');
$self->res->headers->header('Access-Control-Max-Age'           => '1728000');
在服务器端(在,因此端口不同),我使用Mojolicious中的perl脚本返回头,如下所示:

angular.config(['$httpProvider', function ($httpProvider) {
    // Reset headers to avoid OPTIONS request:
    $httpProvider.defaults.headers.common  = {};
    $httpProvider.defaults.headers.post    = {};
    $httpProvider.defaults.headers.put     = {};
    $httpProvider.defaults.headers.patch   = {};
    $httpProvider.defaults.withCredentials = true;
}]);
# Set response headers so that we can send cross-domain requests
$self->res->headers->header('Access-Control-Allow-Origin'      => $self->req->headers->header('origin'));
$self->res->headers->header('Access-Control-Allow-Credentials' => 'true');
$self->res->headers->header('Access-Control-Allow-Methods'     => 'GET, POST, OPTIONS');
$self->res->headers->header('Access-Control-Allow-Headers'     => 'Content-Type, X-CSRF-Token');
$self->res->headers->header('Access-Control-Max-Age'           => '1728000');
现在,这段代码在Angular 1.2中非常有效。然而,当我尝试升级到Angular 1.5时,一切都停止了。查看我的日志和firebug时,会访问服务器,执行正确的脚本,服务器返回正确的值,浏览器(使用firefox和chrome进行测试)会忽略返回的所有内容,包括任何错误代码。问题似乎也发生在Angular 1.4上


在这期间有什么变化吗?是否需要运行一些额外的代码才能接受跨域请求?

我认为不需要检查CORS。它只发送http请求并在promise resolve方法中返回结果


在经历了很多头痛之后,我发现了问题所在。事实证明,它最终与CORS没有任何关系,但我在这里发布它,希望在升级过程中遇到类似问题的其他人会发现它很有用:

在我的网站中,用户使用会话cookie进行标识。我有一段代码来检查身份验证cookie是否存在,如果不存在,它会立即重定向回登录页面

我使用的代码是:

navigationModule.controller( 'NavigationController', ['$scope', '$cookies', 
    function( $scope, $cookies ){
        if(!$cookies.auth) {
            window.location = '/login.html';
        }
    }  
]);
事实证明,从Angular版本1.2到1.5,访问cookie的语法发生了变化。所以我的if语句总是返回false,立即重定向,解释了为什么请求被如此突然地切断。在过去,我在CORS请求方面遇到了很多麻烦,这些请求显示出类似的行为,即在出现问题时不返回任何有用的错误消息,因此我错误地将其归为错误

修复此问题的代码:

navigationModule.controller( 'NavigationController', ['$scope', '$cookies', 
    function( $scope, $cookies ){
        if(!$cookies.get('auth')) {
            window.location = '/login.html';
        }
    }
]);

在旧版本中,结果是来自服务器的干净数据。在新版本中,它返回xhr对象,如下所述:这就是为什么可以改变事物的原因。。。当您检查实际请求时,具体的区别是什么?当我用firebug检查请求时,它们的标题是红色的,就像一个错误一样。展开时只有headers选项卡,它只包含请求头,而不包含响应头。我也没有看到任何错误代码或响应。因此,如果这不是问题所在,那么从Angular 1.2升级到1.5会导致浏览器仅声明服务器请求无效吗?