【问题标题】:Angularjs - handling 401's for entire appAngularjs - 处理整个应用程序的 401
【发布时间】:2014-05-18 08:31:09
【问题描述】:

我的一个控制器中有以下代码可以优雅地处理 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,这样我就不必在每个控制器中都使用这个逻辑。它是我需要的拦截器吗?如果需要,有人可以分享一些代码吗?

谢谢

【问题讨论】:

标签: angularjs


【解决方案1】:

出于全局错误处理、身份验证或任何类型的请求的同步或异步预处理或响应的后处理的目的,希望能够在请求被传递到服务器之前拦截请求并在响应被传递之前拦截它们移交给发起这些请求的应用程序代码。拦截器利用 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

【讨论】:

  • 谢谢 - 所以我已经添加了这个块但是在我的控制器中我可以访问state 以便我可以使用$state.go() 重定向 - 当我尝试在配置中使用它时我得到错误
  • Unknown provider: $state
  • 我应该从拦截器重定向吗?
  • 好吧,上面的块中没有提到那个提供者,所以这个错误必须来自应用程序中的其他地方。关于重定向,这取决于您要执行的操作。因为401 表示未经授权,所以我会尝试重定向到登录页面,是的。
  • 我在我的控制器中包含了对 $state 的引用,但同样的方法在拦截器中不起作用 - 你将如何从拦截器重定向?
猜你喜欢
  • 2014-09-14
  • 2016-02-11
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
相关资源
最近更新 更多