我有一个角度js客户端向服务器发出请求。我的http提供程序(http://localhost)代码如下所示:
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;
}]);
在服务器端(http://localhost:3000,所以只是端口不同),我用Mojolicious中的perl脚本返回标题,如下所示:
# 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似乎也出现了这个问题。
与Angular同时发生了什么变化?是否需要运行一些额外的代码才能接受跨域请求?
答案 0 :(得分:1)
经过很多头痛后,我发现了问题所在。事实证明它最终与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';
}
}
]);
答案 1 :(得分:0)
我认为角度不检查CORS。它只是发送http请求并在promise resolve方法返回结果。
https://github.com/angular/angular.js/blob/v1.5.0-rc.1/src/ng/http.js#L1245 https://github.com/angular/angular.js/blob/v1.5.0-rc.1/src/ng/httpBackend.js#L101