Angularjs - 处理整个应用程序的401

tom*_*456 10 angularjs

我在我的一个控制器中有以下代码来优雅地处理401:

ChannelsService.query(function(response) {
    $scope.channels = response;
}, function(error) {
    if (error.status == 401) {
        $state.go('login');
    }

});
Run Code Online (Sandbox Code Playgroud)

和我的相应service:

myServices.factory('ChannelsService', function ($resource) {
    return $resource('/channels', {}, {
        query: { method: 'GET', isArray: true },
        create: { method: 'POST' }
    })
});
Run Code Online (Sandbox Code Playgroud)

我想知道如何全局处理401,这样我就不必将这个逻辑运用到每个控制器中.它是我需要的拦截器,如果是这样,有人可以共享一些代码吗?

谢谢

Wot*_*els 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;

            }
        };
    });

}]);
Run Code Online (Sandbox Code Playgroud)

正如名称已经暗示的那样,这将拦截每个请求并调用提供的函数(如果有)responseError(您也可以为成功的请求添加拦截器)

有关详细信息,请参阅$ http文档