每当我在任何请求之前发出$ 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
答案 0 :(得分:0)
尝试将令牌验证抽象到其他服务中。我没有测试它^但它应该工作。
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;
}]);