【发布时间】: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