2015-05-27 12 views
5

Tôi gặp sự cố với các cuộc gọi $ http trong AngularJS. Tôi đã tạo các dịch vụ sau

crApp.service('authService', function ($http) { 

    var urlBase = 'http://192.168.xx.xx:8081'; 

    // POST api/login/ 
    this.login = function (credentials) { 
    return $http.post(urlBase + "/api/login", credentials); 
    }; 

    // POST api/logout/ 
    this.logout = function() { 
    return $http.post(urlBase + "/api/logout/", ""); 
    }; 

}); //end service 

crApp.service('dataService', function ($http) { 

    var urlBase = 'http://192.168.xx.xx:8081'; 

    // POST api/query/ 
    this.pull = function (query) { 
    return $http.post(urlBase + "/api/query", query); 
    }; 

Từ bộ điều khiển tôi gọi là phương pháp đăng nhập:

$scope.login = function(){ 
    authService.login(credentials) 
     .success(function(data) { 
      console.log("RESULT LOGIN: " + data); 
     }) 
     .error(function(data, status, headers, config) { 
      console.log(data); 
      console.log(status); 
      console.log(headers); 
      console.log(config); 
     }); 
}; 

Cho đến nay rất tốt và tôi nhận được phản hồi nơi một cookie được thiết lập: enter image description here

Sau khi đăng nhập thành công, tôi gọi phương thức sau:

var locations = { query: "from location select uid, name, description, address, phone", dataFormat: "verbose" }; 
$scope.getLocations = function() { 
    dataService.pull(portals) 
     .success(function (data) { 
      console.log("RESULT QUERY: " + data) 
     }) 
     .error(function(data, status, headers, config) { 
      console.log("Query niet gelukt!"); 
      console.log(data); 
      console.log(status); 
      console.log(headers); 
      console.log(config); 
     }); 
}; 

Kết quả:

enter image description here

Vì vậy, cookie sẽ không được thiết lập trong các tiêu đề. Tôi đang sử dụng AngularJS 1.3.15 và các cuộc gọi được thực hiện đến một máy chủ từ xa trên một miền khác, nhưng nó hoạt động trong công cụ REST Client trong WebStorm (Jetbrains). Vì vậy, nó phải là một cái gì đó tôi đang thiếu trong Angular! ??

Hy vọng rằng ai đó có thể giúp tôi.

Trả lời

11

Bạn cần đặt withCredentials = true trong cấu hình $http để cho phép cookie được đặt trên yêu cầu CORS. This article explains more about cookies and CORS.

Trong cấu hình ứng dụng của bạn:

$httpProvider.defaults.withCredentials = true; 

Ví dụ:

angular.module('myApp', []) 
.config(['$httpProvider'){ 
    $httpProvider.defaults.withCredentials = true; 
}]); 

Bạn có thể đọc về tùy chọn này trong $http provider documentation.

+1

Bạn cần 'withCredentials' ở phía máy khách, nhưng bạn cũng cần đặt tiêu đề 'Access-Control-Allow-Credentials: true' ở phía máy chủ? Nếu không, nó sẽ không hoạt động. Nếu bạn thấy ở cuối bài viết tôi đã liên kết, bạn sẽ thấy các yêu cầu của máy chủ. – Scott

+0

Đồng nghiệp của tôi, người quản lý mã của phía máy chủ là khá chắc chắn mọi thứ được đặt chính xác trên máy chủ. Sự lựa chọn khác? – marlonlaan

+0

@MarlonVanDerLaan Đó là cách nó hoạt động, nếu nó được thiết lập theo hướng dẫn đó với những gì bạn đã đăng nó sẽ hoạt động. Tôi sẽ xác minh "khá chắc chắn" bởi vì đó là một phần quan trọng, nó là một stopper hiển thị ở đó. Tiêu đề đó bị thiếu trong ảnh chụp màn hình ở trên của bạn cho phản hồi. – Scott

Các vấn đề liên quan