【问题标题】:AngularJS Interceptor Never Catches 401 ErrorAngularJS 拦截器永远不会捕获 401 错误
【发布时间】:2014-11-02 01:10:57
【问题描述】:

我正在使用带有Ionic Framework 的Angular v1.2.20。我看过很多关于如何通过使用拦截器并将其推送到 $httpProvider.interceptors 数组来处理来自服务器的 401 错误的文章和帖子。

由于某种原因,401 响应永远不会被我的拦截器中的 repsonseError 函数捕获。我期望拒绝的承诺永远不会拒绝,我的应用程序似乎只是挂起(从下面的loading:hide 永远不会被调用)。我可以从我的 web 调试代理中看到,服务器肯定返回了 401。

我的拦截器:

.factory('interceptorService', function($rootScope, $q, Session, AuthorizationHeader) {
  var interceptorService = {
    request: function(config) {
      $rootScope.$broadcast('loading:show');
      config.headers['Authentication-Key'] = Session.key();
      config.headers['Authentication-Timestamp'] = (new Date().toJSON());
      config.headers['Authentication-Account'] = Session.accountName();
      if(typeof config.headers['Authorization'] === 'undefined') {
        config.headers['Authorization'] = 'Custom-HMAC-SHA512 ' + AuthorizationHeader.buildHashed(config, Session.key());
      }
      return config || $q.when(config);
    },

    response: function(response) {
      if(response.status === 401) {
        console.log('401');
      }
      $rootScope.$broadcast('loading:hide');
      return response || $q.when(response);
    },

    requestError: function(config) {
      $rootScope.$broadcast('loading:hide');
      return $q.reject(config);
    },

    responseError: function(response) {
      console.log('response error');
      $rootScope.$broadcast('loading:hide');
      return $q.reject(response);
    }
  };

  return interceptorService;
})

我可以确认拦截器正在工作,因为当我从服务器返回 403 时,我可以在控制台日志中看到“响应错误”。另请注意,无论使用何种 HTTP 动词,都会发生这种情况。 HEAD 调用和 DELETE 调用都会发生这种情况。

非常感谢任何帮助。

## 编辑

看来这个问题是由cordova/phonegap 无法处理引用in this blog post 的401 响应中的www-authenticate 标头引起的。

如果有人对如何最好地处理它有任何想法,我会全力以赴。

【问题讨论】:

  • 但试图把 console.log('something');在 if 之外?并查看是否输入了响应函数一般
  • @NarekMamikonyan 我试过了。我没有从 response 函数中得到任何日志。还有其他想法吗? loading:hide 也永远不会被触发。
  • 服务器是否发送401状态?
  • @charlietfl 我正在使用Charles 作为 Web 调试代理并从服务器看到 401。所以,是的,我相信我会得到 401。同样,403s 和 500s 击中了响应错误函数。只是出于某种原因不是 401。
  • 你确定你在 $httpProvider.interceptors 中推送了什么拦截器吗?

标签: javascript angularjs cordova angularjs-service ionic-framework


【解决方案1】:

只需在响应返回到您的应用程序之前从响应中删除 WWW-Authenticate 标头即可。这就是为我解决的问题。

handle 401 unauthorized error on windows Phone with Phonegap

编辑:在我的工作中使用的实现是在我们的 F5(负载平衡器)上完成的,因为这是我们的基本身份验证发生的地方。

这是我制作的,尚未经过测试的东西。您可以将它放在 Global.asax.cs 文件中的 Application_EndRequest 方法中:

    if (context.Response.Headers.Contains("WWW-Authenticate"))
        context.Response.Headers.Remove("WWW-Authenticate");

【讨论】:

  • 这听起来不错;您能否更新您的示例,说明如何从服务中删除该标头? response 和 responseError 属性永远不会在拦截器中被击中。如何从服务端删除它?我很乐意接受这个答案
猜你喜欢
  • 2023-03-17
  • 2014-02-09
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2015-04-07
相关资源
最近更新 更多