我确信有一种简单的方法可以做我想做的事情,我只是无法绕过它.如果失败,我怎样才能获得角度的http拦截器来重试请求?我想我必须在请求中建立某种承诺吗?然后在响应中我将不得不检查响应是否是错误,如果是,那么做出承诺吗?怎么做的?我一直试图改变这里的例子:http://docs.angularjs.org/api/ng.$http
我试图使用拦截器的原因是因为我需要在请求URL中添加令牌和其他一些东西,以及处理xdr的一些事情.
我有一个角度应用程序,有时会为每个状态执行多个$ http.get请求.该应用程序使用JWT进行用户身份验证和刷新令牌.API服务器会发送401因auth错误而失败的每个请求.我做了一个http interceptor请求带有401错误的刷新令牌的新令牌,然后重新发送原始请求.
问题是,如果一个州例如2 $ http.get请求并且都得到401响应,那么我更新访问令牌两次.显然我只想刷新令牌一次,但我还是想重新发送两个失败的请求.
这是可以实现的,如果可以的话怎么样?
app.factory('AuthInterceptor', function($q, $injector, RESOURCE_URL, API_BASE, authService) {
return {
request: function(config) {
config.headers = config.headers || {};
if (authService.getAccessToken()) {
if (config.url.substring(0, RESOURCE_URL.length) !== RESOURCE_URL) {
config.headers.Authorization = 'Bearer ' + authService.getAccessToken();
}
}
return config;
},
responseError: function(response) {
switch (response.status) {
case 401:
var deferred = $q.defer();
$injector.get("$http").post(API_BASE + '/api/auth/refresh', {refreshtoken: authService.getRefreshToken()}).then(function(r) {
if (r.data.data.accesstoken && r.data.data.refreshtoken && r.data.data.expiresin) {
authService.setAccessToken(r.data.data.accesstoken);
authService.setRefreshToken(r.data.data.refreshtoken);
authService.setExpiresIn(r.data.data.expiresin);
$injector.get("$http")(response.config).then(function(resp) {
deferred.resolve(resp);
},function(resp) …Run Code Online (Sandbox Code Playgroud)