我想在Angular.js的单页Web应用程序上实现身份验证。 official Angular documentation建议使用拦截器:
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return {
// ...
'responseError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return $q.reject(rejection);
}
};
});
问题是服务器发送401错误,浏览器立即停止“未授权”消息,或者使用登录弹出窗口(当服务器发送认证HTTP标头时),但Angular无法捕获它拦截要处理的HTTP错误,如建议的那样。我误会了什么吗?我尝试了在网络上找到的更多示例(例如this,this和this),但没有一个有效。
答案 0 :(得分:62)
对于AngularJS> 1.3使用$httpProvider.interceptors.push('myHttpInterceptor');
.service('authInterceptor', function($q) {
var service = this;
service.responseError = function(response) {
if (response.status == 401){
window.location = "/login";
}
return $q.reject(response);
};
})
.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('authInterceptor');
}])
答案 1 :(得分:26)
在app config block中:
var interceptor = ['$rootScope', '$q', "Base64", function(scope, $q, Base64) {
function success(response) {
return response;
}
function error(response) {
var status = response.status;
if (status == 401) {
//AuthFactory.clearUser();
window.location = "/account/login?redirectUrl=" + Base64.encode(document.URL);
return;
}
// otherwise
return $q.reject(response);
}
return function(promise) {
return promise.then(success, error);
}
}];
答案 2 :(得分:8)
我不知道为什么,但401错误的响应会成功。
'responseError': function(rejection)
{
// do something on error
if (rejection.status == 401)
{
$rootScope.signOut();
}
return $q.reject(rejection);
},
'response': function (response) {
// do something on error
if (response.status == 401) {
$rootScope.signOut();
};
return response || $q.when(response);
}
答案 3 :(得分:7)
AngularJS拦截器仅适用于使用$ http服务进行的调用;如果您导航到返回401的页面,AngularJS甚至都不会运行。