2016-02-27 46 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并广播一个事件(这也打破了周期)。取决于我们更适合的用例。如果您无法修改您需要拨打的服务,那么$注入器将成为您的选择。 –

相关问题