我正在使用Angular 5构建一个应用程序,我正面临这个问题,我导航到该路线,构造函数执行后停止执行,UI加载了一半,然后停止加载。我向ngOnInit添加了一些控制台日志,发现它没有被调用。但是,这仅在刷新身份验证令牌时才会发生。这是与令牌一起进行http调用的httpInterceptor代码。
@Injectable()
export class AuthHttpInterceptor implements HttpInterceptor {
constructor( @Inject(DOCUMENT) private document: Element, private
adalService: AdalService, private injector: Injector) { }
intercept(request: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>> {
if (request.url !== '/config.json') {
return this.getToken(request.url)
.switchMap((token) => {
if (this.adalService.userInfo) {
this.adalService.userInfo.isAuthenticated = true;
}
this.removeAdalFrame();
return next.handle(request.clone({ setHeaders: { Authorization: `Bearer ${token}` } }));
}).catch((error: HttpErrorResponse) => {
if (error.status == null) {
console.log('Not recoverable error, logging out.');
this.removeAdalFrame();
}
return Observable.throw(error);
});
} else {
return next.handle(request.clone());
}
}
private getToken(url): Observable<string> {
return this.adalService.acquireToken(this.adalService.GetResourceForEndpoint(url)).delay(200);
}
private removeAdalFrame() {
const iFrames = this.document.getElementsByTagName('iframe');
for (let i = 0; i < iFrames.length; i++) {
if (iFrames[i].id.startsWith('adalRenewFrame')) {
iFrames[i].remove();
}
}
}
}
因此,只要“ getToken”刷新令牌并在过期时到达microsoft生成新令牌,问题就会开始。一些特定的routerLink中断,即未加载子组件,某些输入属性未从父组件正确传播到子组件,等等。看起来好像发生了更改检测问题。但是,一旦我刷新了应用程序,一切就会再次按预期运行,也就是说,怪异的行为仅在令牌被刷新时才发生。重新发布应用程序后,一切都会恢复正常。
知道为什么会这样吗?