JavaScript [AngularJS] 怎么给 http interceptor 传递初始化参数?

merlinran · 2013年09月30日 · 最后由 merlinran 回复于 2013年09月30日 · 4932 次阅读

Rich client 通常都有随时保证登录的需求,https://github.com/witoldsz/angular-http-auth 这个 http interceptor,发现返回 401,就把 http request 缓存起来,验证通过之后再批量发出,处理逻辑很优雅。

但我面对的是遗留系统,ajax 不返回 401,而是重定向到登录页面。所以,我希望做一些改进,传一个 Predicator 来判断是否需要登录。

但 js 和 angular 的新手,实在不知如何实现,请高手点拨一二。

找到一个 workaround,把 checker 放在每个$http request 的 config 里,然后在 interceptor 中检查。

var interceptor = ['$rootScope', '$q', 'httpBuffer', function($rootScope, $q, httpBuffer) {

  function retryAterLogin(response) {
      var deferred = $q.defer();
      httpBuffer.append(response.config, deferred);
      $rootScope.$broadcast('event:auth-loginRequired');
      return deferred.promise;
  }

  function success(response) {
    var checker = response.config.authRequiredChecker || function(response) { return false; };
    if (checker(response)) {
      return retryAterLogin(response);
    }
    // otherwise, default behaviour
    return response;
  }

  function error(response) {
    function defaultChecker(response) {
      return response.status === 401 && !response.config.ignoreAuthModule;
    };
    var checker = response.config.authRequiredChecker || defaultChecker;
    if (checker(response)) {
      return retryAterLogin(response);
    }
    // otherwise, default behaviour
    return $q.reject(response);
  }

  return function(promise) {
    return promise.then(success, error);
  };

但这样实在不优雅。所以还要继续讨教。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号