Обработка времени ожидания OAM в Angular 6 с помощью Route-Resolvers
У меня есть приложение Angular 6, которое использует cookie-файлы для проверки подлинности OAM для взаимодействия с внутренними веб-службами. Сеансы OAM истекают через X минут или когда тот же пользователь вошел в систему с другого устройства. Я хочу справиться с этим и отобразить всплывающее окно для пользователей, чтобы они могли щелкнуть их и перейти на страницу входа. Я создал HttpInterceptor и вызываю службу для отображения всплывающего окна.
Когда я развертываю приложение (создаю его, используя ng build
и конфигурации производственного режима) он прекрасно работает всякий раз, когда истекает сеанс, и следующее действие пользователя - перейти к пути, для которого не определен определитель маршрута, определенный в модуле маршрутизации, то есть службы вызываются внутри компонента после инициализации. Всякий раз, когда я пытаюсь перейти к пути, для которого сначала нужно вызвать распознаватель, ничего не происходит. Я пытался добавить консольные журналы и несколько раз переустанавливал, чтобы увидеть, что может быть не так, но распознаватель и перехватчик даже не вызываются. Я просто получаю следующие ошибки на вкладке Консоль, и никакой навигации не происходит:
Uncaught SyntaxError: Unexpected token < at https://login...?bmctx=920634F2F55...e9b2.js
Error: Loading chunk 21 failed...
Из того, что я понимаю, 1-я ошибка заключается в том, что он пытается проанализировать ответ на запрос (который происходит от автоматического перенаправления OAM на страницу входа в систему) и <
характер это начало <!DOCTYPE html>
, Кстати, это тот же ответ, который возвращает код ошибки 200 и который я проверяю в моем перехватчике для отображения всплывающего окна.
Странно то, что этого не происходит, когда я запускаю приложение в режиме отладки (используя ng serve
команда). Перехватчик вызывается правильно и во всех случаях! Может ли это быть что-то, связанное с моими конфигурациями сборки, или я пропускаю что-то, связанное с обработкой тайм-аута OAM?
Ниже приведены некоторые разделы моего кода:
@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;
}));
}
}
Развертывание конфигураций сборки в angular.json:
"configurations": {
"dev1": {
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [
{
"replace": "src/./environments/environment.ts",
"with": "src/./environments/environment.prodpro.ts"
}
]
},