我的一个控制器中有以下代码可以优雅地处理401:
ChannelsService.query(function(response) {
$scope.channels = response;
}, function(error) {
if (error.status == 401) {
$state.go('login');
}
});
和我对应的service
:
myServices.factory('ChannelsService', function ($resource) {
return $resource('/channels', {}, {
query: { method: 'GET', isArray: true },
create: { method: 'POST' }
})
});
我想知道如何全局处理401,这样我就不必将这个逻辑运用到每个控制器中。它是我需要的拦截器,如果可以的话,有人可以分享一些代码吗?
由于
答案 0 :(得分:10)
出于全局错误处理,身份验证或任何类型的请求或响应后处理的同步或异步预处理的目的,希望能够在请求被传递到服务器之前拦截请求并在响应之前进行响应移交给发起这些请求的应用程序代码。拦截器利用promise API来满足同步和异步预处理的需求。
您可以在配置应用程序时将拦截器添加到$ httpProvider
app.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push(function($q) {
return {
'responseError': function(rejection){
var defer = $q.defer();
if(rejection.status == 401){
console.dir(rejection);
}
defer.reject(rejection);
return defer.promise;
}
};
});
}]);
正如名称已经暗示的那样,如果有responseError
,这将拦截每个请求并调用提供的函数(您也可以为成功的请求添加拦截器)
有关详细信息,请参阅$http docs