【问题标题】:Make $http request before any other request Angular JS在任何其他请求Angular JS之前发出$http请求
【发布时间】:2016-04-17 19:32:29
【问题描述】:

每当我在任何请求之前发出 $http 请求时,都会遇到流行的循环依赖问题。我以前见过这些问题:

我真的不知道上述这些问题是否与我想要达到的目标相同。我想发出一个 $http 请求来检查我的 JWT 令牌的完整性,我需要在我的服务器端执行此操作。如果令牌已过期,我需要为用户获取另一个令牌。

这是我的代码

var app = angular.module('app', ['ngRoute', 'ngStorage']);

app.factory('requestInterceptor', ['$q', '$localStorage', '$location', function($q, $localStorage, $location)
{
    var requestInterceptor = {};

    requestInterceptor.request = function(config)
    {
//        $http
//        ({
//           url : 'api/token',
//           method: 'GET',
//           headers : { Authorization : $localStorage.token}
//        }).then(function(response){
//           $localStorage.token = response.data.token;
//        },function(response){
//           $localStorage.token = null;
//           $location.path('/');
//        });           

        config.headers = config.headers || {};
        if ($localStorage.token)
        {
            config.headers.Authorization = 'Bearer ' + $localStorage.token;
        }
        return config;        
    };

    requestInterceptor.responseError =  function (response)
    {
        if (response.status === 401 || response.status === 403)
        {
            $location.path('/signin');
        }
        return $q.reject(response);
    };

    return requestInterceptor;
}]);

注意

不能使用Angular-JWT

【问题讨论】:

    标签: angularjs jwt angular-http-interceptors


    【解决方案1】:

    尝试将令牌验证抽象到不同的服务中。我没有测试它^但它应该可以工作。

    app.factory('auth', ['$http', '$localStorage', '$location', function($http, $localStorage, $location){
      return {
        validateToken: function() {
          return $http({
            url : 'api/token',
            method: 'GET',
            headers : { Authorization : $localStorage.token}
          }).then(function(response){
            $localStorage.token = response.data.token;
            return response.data.token;
          },function(response){
            $localStorage.token = null;
            $location.path('/');
          });       
        }
      }
    }]);
    
    app.factory('requestInterceptor', ['auth', function(auth){
      var requestInterceptor = {};
    
      requestInterceptor.request = function(config){
        if (!config.url.startsWith('api/token')) {
          auth.validateToken().then(function(token){
            config.headers = config.headers || {};
            config.headers.Authorization = 'Bearer ' + token;
            return config;   
          });
        } else {
          return config;   
        }
      };
    
      return requestInterceptor;
    }]);
    

    【讨论】:

    • 我得到 $http 未定义。如果我包含 $http 服务,我会遇到循环依赖问题
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多