AngularJS $ http ajax不遵循Location标头

时间:2013-11-28 13:18:05

标签: jquery angularjs grails spring-security

我正在使用Grails插件运行Spring Security。在客户端,我正在运行AngularJS我想要验证用户的位置。理想情况下,我想使用Angular中的$http模块,但显然它不遵循服务器发送的Location:标头。

正在发生的事情是Spring Security返回302 Moved temporarily,应该像jQuery那样自动查询/跟踪。

以下jQuery代码段正常工作,并根据GET响应标头创建新的Location: "http://agrarius.nl/login/ajaxSuccess"请求:

$.ajax({
    url: serverUri+'/j_spring_security_check?ajax=true', 
    data: data,
    method: 'POST'
})

AngularJS方法似乎没有做任何事情,只是退出:

// Setup Config
var data = {
    j_username: $scope.user.email,
    j_password: $scope.user.password
}

var config = {
    method: 'POST', 
    url: serverUri+'/j_spring_security_check?ajax=true', 
    data: $.param(data),
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},

};

// Dispatch HTTP Request
$http(config)
.success(function(data, status, headers, config) {
    if (data.status) {
        // successful login
        User.isLogged = true;
        User.username = data.username;
    }
    else {
        User.isLogged = false;
        User.username = '';
    }
    $scope.loggingIn = false;
})
.error(function(data, status, headers, config) {
    $scope.loggingIn = false;
    User.isLogged = false;
    User.username = '';

    if (status == 0) {
        // Request got cancelled
        console.log("Request got cancelled.");
        return;
    }
});

知道它为什么没有;这样的功能?而使用jQuery是否“安全”? :)

1 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

$http.post(serverUri+'/j_spring_security_check?ajax=true', $.param(data))
.then(function (response){
    var location = response.headers('Location');
    return $http.get(location);
})
.then(function (response) {
    if (response.data.status) 
    {
      // successful login
      User.isLogged = true;
      User.username = response.data.username;
    }
    else 
    {
      User.isLogged = false;
      User.username = '';
    }
    $scope.loggingIn = false;
});