2016-01-19 77 views
1

我有一個角度js客戶端向服務器發出請求。我的HTTP提供商(在http://localhost)的代碼如下所示:Angular 1.5 CORS

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時,事情就停止了。當查看我的日誌和螢火蟲時,服務器被訪問,執行正確的腳本,服務器返回正確的值,瀏覽器(同時使用firefox和chrome進行測試)只是忽略發回的所有內容,包括任何錯誤代碼。這個問題似乎也發生在Angular 1.4中。

與Angular在此期間做了些什麼改變?是否需要運行一些額外的代碼才能接受跨域請求?

+0

在老版本的角度的結果已經從服務器乾淨的數據。 在新版本中它返回xhr對象,描述如下:https://docs.angularjs.org/api/ng/service/$http 這就是爲什麼有可能 –

+0

事情發生變化......具體是什麼您檢查實際請求時的差異? – charlietfl

+0

當我使用螢火蟲檢查請求時,它們的標題字體呈紅色,就像發生錯誤一樣。擴展它們時只有標題選項卡,並且只包含請求標題,而不包含響應標題。我也沒有看到任何錯誤代碼或響應。 – psgels

回答

1

很多麻煩後,我想通了什麼問題了。事實證明,它最終與CORS沒有任何關係,但是我在此發佈它,希望在升級時遇到類似問題的其他人會發現它很有用:

在我的網站中,用戶識別會話cookie。我有一段代碼檢查身份驗證Cookie是否存在,如果不存在,則會立即重定向回登錄頁面。

我使用的代碼是:

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

而且事實證明,從角版本1.2至1.5,用於訪問所述餅乾的語法被改變了。所以我的if語句總是返回false,立即重定向,解釋爲什麼這些請求被突然切斷。過去,我在CORS請求方面遇到了很多麻煩,這些請求顯示出類似的行爲,即在發生錯誤時不返回任何有用的錯誤消息,所以我錯誤地將其寫成這樣。

是固定的問題代碼:

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