Angularjs(1.3.6+)$资源拦截器和全局401处理程序

时间:2015-01-05 02:41:17

标签: javascript angularjs http-status-code-401 angular-http-interceptors

我的问题是关于$resource的拦截器(responseError)。我想强调的是,我所基于的angularjs是V1.3.6

问题:

app.factory('authInterceptor',['$q', '$location', '$log', function($q, $location, $log){
    $log.debug('this is a regular factory with injection');
    return {
        responseError: function(response){
            console.log(response)
            // problem is that I cant check 401 by response.status, 
            // because the response here is AN ERROR OBJECT like `SyntaxError: ...`. Anyway to get the status?
            return $q.reject(response);
        }
    }
}])

当我得到401响应时,responseError的参数是SyntaxError: Unexpected token U之类的错误对象,因为来自服务器的响应是纯文本Unathorized,其状态为401

但是我希望得到response.status,如果是401则执行某些操作。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

这个问题应该结束,因为我终于找到了答案。

当响应为401/404且除了200以外的任何内容时,transformResponse仍然执行且发生错误!这个错误只是覆盖正常的响应(有状态属性),所以我永远不会在拦截器内获得原始响应!

如果响应的状态不是200,我认为执行transformResponse是愚蠢的!在transformResponse内,您无法访问状态代码...

答案 1 :(得分:0)

这是一个处理401s的简单拦截器,以及一些配置:

angular.module('notesApp', [])
  .factory('AuthInterceptor',['AuthInfoService', '$q', function(AuthInfoService, $q) {
      return {

        responseError: function(responseError) {
              if (responseError.status === 401) { // authentication issue
                    //redirect user to login or do something else...
              }
              return $q.reject(responseError);
        }
     };
 }])
 .config(['$httpProvider', function($httpProvider) {
     $httpProvider.interceptors.push('AuthInterceptor');
}]);

**这是一个拦截器,只拦截带有非200状态代码的传入响应。** 如果状态代码为401,则将用户重定向到登录页面。在这种情况下,承诺被拒绝,以便控制器或服务仍然看到失败