Page 181 - AngularJS权威教程
P. 181
16.7 使用 AngularJS 进行身份验证 161
来处理所有的响应。 1
现在,我们在应用的.config()代码块内设置$http响应拦截器,并将$httpProvider注入
其中: 2
angular.module('myApp', [])
.config(function($httpProvider) {
// 在这里构造拦截器 3
});
这个拦截器会处理所有请求的响应以及响应错误。 4
angular.module('myApp', [])
.config(function($httpProvider) {
// 在这里构造拦截器 5
var interceptor = function($q, $rootScope, Auth) {
return {
'response': function(resp) { 6
if (resp.config.url == '/api/login') {
// 假设API服务器返回的数据格式如下:
// { token: "AUTH_TOKEN" }
Auth.setToken(resp.data.token); 7
}
return resp;
}, 8
'responseError': function(rejection) {
// 错误处理
switch(rejection.status) {
case 401: 9
if (rejection.config.url!=='api/login')
// 如果当前不是在登录页面
$rootScope.$broadcast('auth:loginRequired'); 10
break;
case 403:
$rootScope.$broadcast('auth:forbidden');
break; 11
case 404:
$rootScope.$broadcast('page:notFound');
break; 12
case 500:
$rootScope.$broadcast('server:error');
break;
} 13
return $q.reject(rejection);
}
}; 14
};
});
这个授权拦截器会处理特定请求中一些可预见的服务器响应状态码。当拦截器捕获到401状 15
态码,会通过$broadcasts从$rootScope开始向所有的子作用域广播此事件。
另外,拦截器会为任何返回200状态码的请求将令牌保存到/api/login登录路由中。 16
为了实现这个拦截器,需要让$httpProvider将这个拦截器添加到拦截器链中:
17
angular.module('myApp', [])
.config(function($httpProvider) {
// 在这里构造拦截器
var interceptor = function($q, $rootScope, Auth) { 18