我正在使用非常基本的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时,角度不会打印任何内容。控制台将保持为空,仅使用POST http://127.0.0.1/login 401 (Unauthorized)
提示。但是没有success
或catch
作为输出。而且没有finally
。
在我的项目中,将使用$rootScope.$on('event:auth-forbidden', function(r) {...});
全局捕获403。这就是为什么REST服务器只会在找不到内容时抛出404的原因,403当用户没有权限和/或没有登录时抛出404,而仅在登录失败时抛出401。
那我怎样才能在$http
上抓到401?
不是.then
承诺只返回200而.catch
是其他每次返回!= 200?
我正在使用angularJS v1.6.4和angular-http-auth v1.5.0。
答案 0 :(得分:2)
问题是angular-http-auth
模块拦截状态为401或403的响应:
$http
拦截器执行以下操作:缓冲每个HTTP 401响应的配置对象(这是请求的URL,有效负载和参数),每次发生时,事件:auth-loginRequired消息从$rootScope
。
禁用401拦截器集ignoreAuthModule: true
:
有时您可能不希望拦截器拦截请求,即使返回401或403.在这种情况下,您可以将
ignoreAuthModule: true
添加到请求配置中。
模块在处于401状态的待处理状态中创建新承诺。响应已缓冲,您可以调用authService.loginConfirmed()
或authService.loginCancelled()
个函数。第一个重试由于HTTP 401响应而先前失败的所有请求。当第二个请求取消之前因HTTP 401响应而失败和缓冲的所有待处理请求。