如何解决角度拦截器:未调用 Http 请求
我试图在每次请求之前获取 RefreshToken,如果它已过期,我需要刷新它。拦截器调用服务的函数,但我从未收到 API 调用。请帮忙
我的拦截器代码
public intercept(request: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
if (!this.authService.isAccessTokenExpired()) {
return next.handle(this.addCookiesToRequest(request));
}
if (this.refreshTokenInProgress) {
return this.refreshTokenSubject.pipe(
filter(result => result !== null),take(1),switchMap(() => next.handle(this.addCookiesToRequest(request)))
);
} else {
this.refreshTokenInProgress = true;
this.refreshTokenSubject.next(null);
return this.authService.refreshExpiredToken().pipe(
switchMap((token: any) => {
this.refreshTokenInProgress = false;
this.refreshTokenSubject.next(token);
return next.handle(this.addCookiesToRequest(request));
}),catchError((error: any) => {
this.refreshTokenInProgress = false;
return Observable.throw(error);
})
);
}
}
}
public addCookiesToRequest(request: HttpRequest<any>): HttpRequest<any> {
return request.clone({
withCredentials: true
});
}
authService refreshToken 代码
refreshExpiredToken() {
return this.http.get(`${api_url}/token/refresh`,{
withCredentials: true,observe: 'response'
}).pipe(
tap((res) => {
if (res.status >= 300 && res.status < 400) {
window.location.href = res.url;
}
}),catchError((error) => {
if (error.status === 401) {
this.router.navigate(['/login']);
}
return of(error);
})
);
}
我什至尝试在某处添加 .subscribe(),但仍然没有
解决方法
所以问题是我没有从拦截器中排除 refreshToken URL,这就是它在无限循环中拦截自身的原因,这就是它从未被实际调用的原因。
,我认为潜在的问题是您想在客户端处理引用令牌状态。
除此之外,在您的代码中,您的第二个 if 语句依赖于 else 语句:当 refreshTokenInProgress 为真时,拦截器返回 refreshTokenSubject,它将发出一些值 only 在 else 语句中。这样
switchMap(() => next.handle(this.addCookiesToRequest(request)))
永远不会被触发。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。