解析Angular期间HTTP Interceptor内部的目标URL

时间:2018-08-03 13:13:36

标签: angular url router resolve angular-http-interceptors

我有一个Angular项目,我在其中建立了这样的解析路线:

{
  path: 'participants/detailedView/:participantId',
  component: ParticipantDetailedViewComponent,
  resolve: {
    participant: ParticipantResolve,
  },
},

我的项目中也有一个HTTP拦截器,以拦截任何401错误并重定向到登录页面:

@Injectable()
export class JwtInterceptor implements HttpInterceptor {

  constructor( public auth: AuthenticationService,
               private router: Router ) {
  } 

  public intercept( request: HttpRequest<any>, next: HttpHandler ): Observable<HttpEvent<any>> {
    let url: string = request.url;
    let method: string = request.method;
    console.log(`JwtInterceptor url=${url},   method=${method}`);

    return next.handle( request ).do( ( event: HttpEvent<any> ) => {
        console.log(`successful reply from the server for request=${request.urlWithParams}`);
    })
    .catch((responseError: any) => {

      // ResponseError Interceptor
      if (responseError instanceof HttpErrorResponse) {
        console.error('response in the catch: ', responseError);

          if ( responseError.status === 401 ) {
            let errorMsg: string = '';

            if ( responseError.statusText === 'Invalid credentials' ) {
              errorMsg = 'Username or password is incorrect';
            }

            // redirect to the login route
            this.router.navigate(['/login'], {queryParams: {msg: errorMsg}});
            return Observable.empty();
          }

        return throwError(responseError);
      }


      let error = new HttpErrorResponse({
        status: 500,
        statusText: 'Unknown Error',
        error: {
          message: 'Unknown Error'
        }
      });
      return throwError( error );

    }) as any;
  }
}

如果在解析过程中的HTTP调用期间抛出401错误,我的拦截器会将用户重定向到登录页面。

这时,我想知道目标URL是什么,以便能够将用户重定向到他成功登录后想要查看的页面。

所以我的问题是:如何通过HTTP拦截器知道目标URL?

到目前为止,我找到的唯一解决方案是在服务中监听NavigationStart事件,将值存储并在我的HTTP Interceptor中使用它。 我不太喜欢这种解决方案,我认为应该有更好的方法,但是找不到。

有什么想法吗?

0 个答案:

没有答案