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
   176   177   178   179   180   181   182   183   184   185   186