2016-02-27 22 views
2

從服務器檢測$http錯誤並在任何調用導致401錯誤時刪除令牌的最簡單方法是什麼?例如,如果會話在用戶未使用應用程序時到期,則當他們返回到Web應用程序時,令牌不再有效。如果我在API調用期間發回401錯誤,我需要注意到這一點,並讓用戶重新登錄。如何刪除API錯誤401上的令牌?

目前,在Chrome開發人員工具中,我可以看到401錯誤,但Satellizer不會刪除令牌(以爲它曾經一次)。

我試圖創建一個httpInterceptor,但收到Circular Dependency error

apiLogoutInterceptor.$inject = ['$q', '$auth']; 
function apiLogoutInterceptor ($q, $auth) { 
    var service = this; 
    service.responseError = function (response) { 
     if (response.status == 401) { 
      $auth.removeToken(); 
      window.location = '/login'; 
     } 
     return $q.reject(response); 
    }; 
} 

configureApiLogout.$inject = ['$httpProvider']; 
function configureApiLogout ($httpProvider) { 
    $httpProvider.interceptors.push('apiLogoutInterceptor'); 
} 

回答

2

您可以只注射$injector服務和人工抓取您所需的相關解決辦法的循環依賴。舉一個例子,看到這個帖子:AngularJS: Injecting service into a HTTP interceptor (Circular dependency)

此外,我看不出有任何理由使用var service = this,因爲它是足夠返回包含該處理方法爲responseError鍵這樣的簡單對象:

function($injector, ...) { 
    return { 
    'responseError': function(err) { /* your handler logic */ } 
    } 
} 
+0

感謝您的鏈接。它幫助我解決了這個問題。我希望在Satellizer中有這樣的「官方」方式。如果我找不到一個,我會編輯我的問題,標題,並從它的工作後接受答案。 –

+0

當您需要可直接訪問$ http或甚至間接訪問$ http的服務時(例如,通過路由中的$ state),這是一個常見問題。您可以使用$ injector服務,也可以注入$ rootscope並廣播一個事件(這也打破了週期)。取決於我們更適合的用例。如果您無法修改您需要撥打的服務,那麼$注入器將成爲您的選擇。 –

相關問題