2016-02-12 156 views
1

我正在使用angularjs和Im試圖用攔截器處理錯誤。AngularJS - 未授權和攔截器

我所遇到的是如何處理不同的錯誤會議的問題過期登錄失敗當服務器回覆都與401

似乎攔截配置之前,將執行定義任何其他攔截器(順序定義事項):

var configInterceptor = function($httpProvider) 
    { 
    $httpProvider.interceptors.push('unauthorizedInterceptor'); 
    }; 

angular.module('app', []) 
     .config(configInterceptor) 
     .controller.... 

攔截在$資源中定義的s僅在它們通過configInterceptor後纔會被視爲

var res = $resource(serviceUrl + '/users/login',{},{ 
      post:{ 
       method:'POST', 
       params: {}, 
       withCredentials: true, 
       interceptor: { 
        responseError: function(){ 
        console.log('login interceptor'); 
        } 
       } 
      } 
     }); 

我想有一個單點控制,當會話已過期(推送用戶登錄頁面和發送相應的消息),而無需到unauthorizedInterceptor添加到所有$資源,一個一個。

如果錯誤是由於用戶試圖登錄並失敗,那麼攔截器應該以不同的方式對待它(消息將不同)。

任何方式來正確解決這個問題?我也試着定義攔截器只適用於特定的模塊,但它們被觸發。

+0

所有攔截器將被觸發。你可以在你的攔截器中檢查url,如果它匹配登錄路徑,那麼做你的處理,否則跳過它,類似地創建一個攔截器的認證失敗處理和有條件地執行工作 –

+0

因爲我們使用的角度,有一個會話服務,告訴我什麼時候用戶已連接。檢查用戶會話是否設置有助於我有條件地處理攔截。你說的相同的解決方案,而不是檢查URL我檢查會話對象。無論如何,謝謝。 – kitimenpolku

+0

這是一個有狀態的解決方案,您應該檢查用戶打開新選項卡時會發生什麼。這應該觸發「會話過期」而不是登錄失敗(IMO)。無論如何,如果你的服務器只返回401沒有消息,這將不可能知道正確的方式來處理這個問題。有消息嗎?您可以檢查'''''''''''''''''''''''''''''''你在' – martinczerwi

回答

0

我會做這樣的事情:

angular.module('app', []).factory('unauthorizedInterceptor', unauthorizedInterceptor); 

function unauthorizedInterceptor($q, ngUserAuthService) { 

    return { 
     'responseError': function (response) { 

      if (response.status === 401) { 
       // find out if the session has expired or the user login has failed 
       if (sessionExpired()) { 
        doRedirectToSomewhere(); 
       } else if (loginHasFailed()) { 
        response.loginFailed = true; // use this later 
       } 
      } 
      return $q.reject(response); 
     } 
    }; 
} 

然後當你要檢查失敗的登錄攔截僅添加到$資源:

var res = $resource(serviceUrl + '/users/login',{},{ 
    post:{ 
     method:'POST', 
     params: {}, 
     withCredentials: true, 
     interceptor: { 
      responseError: function(response) { 
       console.log('login interceptor'); 
       console.log('The login has failed: ' + response.loginFailed); 
      } 
     } 
    } 
}); 
+0

我就是這麼做的。謝謝 – kitimenpolku