JWT (JSON Web Token) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。在AngularJS应用中,JWT常用于身份验证和授权。
当AngularJS应用使用JWT Auth令牌时出现API调用重复(调用两次)的情况,通常有以下几种可能原因:
确保HTTP拦截器只注册一次:
// 正确的拦截器注册方式
angular.module('app').config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('authInterceptor');
}]);
// 拦截器实现
angular.module('app').factory('authInterceptor', ['$q', '$injector', function($q, $injector) {
return {
request: function(config) {
var authService = $injector.get('authService');
var token = authService.getToken();
if (token) {
config.headers.Authorization = 'Bearer ' + token;
}
return config;
},
responseError: function(response) {
if (response.status === 401) {
// 处理未授权情况
}
return $q.reject(response);
}
};
}]);
如果使用自动刷新令牌机制,确保只发送一次刷新请求:
var refreshingToken = false;
var refreshQueue = [];
function refreshToken() {
if (refreshingToken) {
return;
}
refreshingToken = true;
return $http.post('/refresh-token', { token: currentToken })
.then(function(response) {
// 更新令牌
setNewToken(response.data.token);
// 处理队列中的请求
refreshQueue.forEach(function(cb) {
cb(response.data.token);
});
refreshQueue = [];
return response.data.token;
})
.finally(function() {
refreshingToken = false;
});
}
// 在拦截器中使用
responseError: function(response) {
if (response.status === 401 && !response.config._retry) {
response.config._retry = true;
return refreshToken().then(function(token) {
response.config.headers.Authorization = 'Bearer ' + token;
return $http(response.config);
});
}
return $q.reject(response);
}
确保事件监听器没有被多次绑定:
// 错误的做法 - 每次调用都会添加新监听器
$scope.$on('someEvent', function() {
$http.get('/api/data');
});
// 正确的做法 - 确保只绑定一次
var unbind = $scope.$on('someEvent', function() {
$http.get('/api/data');
});
// 在适当的时候取消绑定
$scope.$on('$destroy', function() {
unbind();
});
确保Promise链正确处理,避免重复调用:
// 错误的做法 - 可能导致重复调用
somePromise.then(function() {
$http.get('/api/data');
});
somePromise.then(function() {
$http.get('/api/data');
});
// 正确的做法
somePromise.then(function() {
return $http.get('/api/data');
}).then(function(response) {
// 处理响应
});
JWT在AngularJS中的典型应用场景包括:
通过以上分析和解决方案,应该能够解决AngularJS中使用JWT Auth令牌时API调用重复的问题。
没有搜到相关的文章