我有一个Angular 6应用程序,该应用程序使用OAM身份验证cookie与后端Web服务进行通信。 OAM会话设置为在X分钟后或同一用户从另一台设备登录时到期。我要处理此问题并向用户显示一个弹出窗口,以便他们可以单击并将其导航到“登录”页面。我创建了一个HttpInterceptor并调用了一个服务以显示弹出窗口。
当我部署应用程序(使用ng build
和生产模式配置来构建应用程序)时,只要会话期满并且下一个用户操作是导航到没有路由解析器的路径,它就可以正常工作在路由模块中定义,即在初始化后在组件内调用服务。每当我尝试导航到需要首先调用解析器的路径时,都不会发生任何事情。我尝试添加控制台日志,并进行了多次重新部署,以查看可能出了什么问题,但甚至没有调用解析器和拦截器。我只是在“控制台”选项卡中收到以下错误,并且没有导航:
Uncaught SyntaxError: Unexpected token < at https://login...?bmctx=920634F2F55...e9b2.js
Error: Loading chunk 21 failed...
据我了解,第一个错误是因为它试图解析请求的响应(这是从OAM的自动重定向到登录页面),而<
字符是{{1}的开头}。顺便说一句,这是相同的响应,它返回错误代码200,并且我在拦截器中签入以便显示弹出窗口。
奇怪的是,当我在调试模式下(使用<!DOCTYPE html>
命令运行应用程序时,不会发生这种情况)。拦截器在任何情况下都可以正确调用!可能是与我的构建配置有关的东西,还是我缺少与OAM超时处理有关的东西?
请参阅以下代码部分:
ng serve
angular.json中的部署构建配置:
@Injectable()
export class ResponseInterceptor implements HttpInterceptor {
constructor(private alertMessageService: AlertMessagesService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(catchError((error: any, caught: Observable<HttpEvent<any>>) => {
if ((error.status === 200 || error.status === 0) && error.url.indexOf('login.') !== -1) {
this.alertMessageService.displayLogoutConfirmation();
return of(error);
}
throw error;
}));
}
}