使用路由解析器处理Angular 6中的OAM超时

时间:2018-10-23 11:28:14

标签: typescript angular6 rxjs6 angular-http-interceptors oracle-access-manager

我有一个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;
    }));
  }
}

0 个答案:

没有答案