我在我的angular js应用程序上实现了JWT。我添加了所有http函数的jwt授权密钥。我的代码是:
angular.module('IttadishopServices', [])
.config(function Config($httpProvider, jwtInterceptorProvider) {
jwtInterceptorProvider.tokenGetter = function (User) {
var jwt = localStorage.getItem('id_token');
if (localStorage.getItem("id_token") === null) {
User.generateToken().success(function (data) {
localStorage.setItem('id_token', data);
return data;
});
} else {
return jwt;
}
}
$httpProvider.interceptors.push('jwtInterceptor');
});
现在问题是,标题上添加了授权密钥。但是每个请求都会发送到服务器。我试图以多种方式添加该授权密钥,但每次每个请求都向服务器发送一个请求时,一个请求使用授权密钥,另一个请求没有任何授权密钥。添加了控制台的屏幕截图。
答案 0 :(得分:0)
问题是你没有在你的截取器中返回一个promise,而你正在拦截器中使用异步函数。因此,在$ q中包装asynch函数并返回一个promise将解决发送请求2次的问题。有一次没有等待异步函数完成(没有键)和一次解析User.generateToken()的承诺。包装
angular.module('IttadishopServices', [])
.config(function Config($httpProvider, jwtInterceptorProvider) {
jwtInterceptorProvider.tokenGetter = function (User) {
var jwt = localStorage.getItem('id_token');
if (localStorage.getItem("id_token") === null) {
var deferred = $q.defer();
User.generateToken().success(function (data) {
localStorage.setItem('id_token', data);
deferred.resolve(data);
});
return deferred.promise;
} else {
return jwt;
}
}
$httpProvider.interceptors.push('jwtInterceptor');
});
但是你不应该在配置块中定义该功能,而应该在工厂中定义。
来源: http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/