我正在为用户登录的非常基本的angularjs代码:
[...]
this.login = function(email, password) {
promise = $http.post('/login',
{
'email': email,
'password': password
});
promise.then(function(response){
console.log("success");
}).catch(function(response){
console.log("catch");
}).finally(function(response){
console.log("finally");
});
return promise;
};
[...]
当REST API与代码200生成响应时,客户端控制台将记录success finally
并登录用户。
当服务器使用403或500代码生成响应时,控制台将打印出catch finally
。
但是,当响应与401的响应时,Angular不会打印出任何内容。控制台只有POST http://127.0.0.1/login 401 (Unauthorized)
提示才能保持空。但是没有success
或catch
作为输出。也没有finally
。
在我的项目中,将使用$rootScope.$on('event:auth-forbidden', function(r) {...});
在全球范围内捕获403。这就是为什么REST服务器仅在找不到某些内容时才投掷404,403当用户未经许可和/或未登录时,只有在登录失败时才登录401。
那么我如何在$http
上捕获401?.then
是否仅承诺返回200和每次返回的.catch
!= 200?
我正在使用AngularJS V1.6.4与Angular-Http-Auth v1.5.0。
问题是angular-http-auth
模块拦截了与状态401或403的响应:
$http
Interceptor执行以下操作:每个HTTP 401响应的配置对象(这是请求的URL,有效负载和参数)都会缓冲,并且每次发生时,事件:auth-loginrequired消息都会从$rootScope
广播。/blockquote>禁用401拦截器集
ignoreAuthModule: true
:有时您可能不希望拦截器拦截请求,即使有人返回401或403。在这种情况下,您可以将
ignoreAuthModule: true
添加到请求配置。该模块在待定状态下以401状态创造了一个新的承诺。响应被缓冲,您有机会致电
authService.loginConfirmed()
或authService.loginCancelled()
功能。第一个检索由于HTTP 401响应而导致的所有请求。当第二个取消所有待处理请求以前由于http 401响应而失败和缓冲。docs