我如何在 angularjs 拦截器中重定向,除非没有错误?

How do I redirect in angularjs interceptor, except not on error?

我想检查是否存在 CSRF cookie 令牌,如果不存在,则重定向到登录。

但是没有 cookie 不会触发 requestError,所以我不能把它放在那里。

我确定我可以简单地将其粘贴在 request 中,但我想这样做 'cleanly' 而不是会导致大量错误的脏重定向控制台,因为我正在重定向中间承诺链。

注意:我没有使用 angular 来管理身份验证。我只是让后端通过营销网站上的标准 POST 表单来处理该问题。这就是为什么它使用 window.location.href 而不是 $location.path().

  $httpProvider.interceptors.push(function($q, $cookies) {
    return {
      request: function(config) {
        if ($cookies.get(xsrfCookieName) && $cookies.get(tokenCookieName)) {
          return config;
        } else {
          // can I do something here to redirect cleanly?
        }
      },
      responseError: function(rejection) {
        if (rejection.status === 401) {
          window.location.href = '/login';
        }
        return $q.reject(rejection);
      }
    };
  });

来自 docs(强调我的):

requestError: interceptor gets called when a previous interceptor threw an error or resolved with a rejection.

因此您可以拒绝并从您的 request 创建状态为 401 的拒绝:

$httpProvider.interceptors.push(function($q, $cookies) {
  return {
    request: function(config) {
      if ($cookies.get(xsrfCookieName) && $cookies.get(tokenCookieName)) {
        return config;
      } else {
        return $q.reject({
          status: 401
        });
      }
    },
    responseError: function(rejection) {
      if (rejection.status === 401) {
        window.location.href = '/login';
      }
      return $q.reject(rejection);
    }
  };
});