Обработка времени ожидания OAM в Angular 6 с помощью Route-Resolvers - PullRequest
0 голосов
/ 23 октября 2018

У меня есть приложение Angular 6, которое использует cookie-файл аутентификации OAM для связи с внутренними веб-сервисами.Сеансы OAM истекают через X минут или когда тот же пользователь вошел в систему с другого устройства.Я хочу справиться с этим и отобразить всплывающее окно для пользователей, чтобы они могли щелкнуть их и перейти на страницу входа.Я создал HttpInterceptor и вызываю сервис для отображения всплывающего окна.

Когда я развертываю приложение (создаю его, используя ng build и конфигурации производственного режима), оно прекрасно работает, когда истекает сеанс, и следующее действие пользователя - перейти к пути, у которого нет маршрута.resolver определен в модуле маршрутизации, т.е. сервисы вызываются внутри компонента после инициализации.Всякий раз, когда я пытаюсь перейти к пути, для которого сначала нужно вызвать распознаватель, ничего не происходит.Я пытался добавить консольные журналы и несколько раз переустанавливал, чтобы увидеть, что может быть не так, но распознаватель и перехватчик даже не вызывались.Я просто получаю следующие ошибки на вкладке Консоль, и навигация не происходит:

Uncaught SyntaxError: Unexpected token < at https://login...?bmctx=920634F2F55...e9b2.js

Error: Loading chunk 21 failed...

Из того, что я понимаю, первая ошибка заключается в том, чтоон пытается проанализировать ответ на запрос (который происходит от автоматического перенаправления 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"
        }
      ]
    },
...