尝试在HTTP拦截器中捕获401,刷新我的会话,然后重试原始请求

时间:2019-03-13 13:28:08

标签: angular typescript

我试图拦截来自intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { if (!request.url.startsWith('/api')) { return next.handle(request) } const cloned = request.clone() return next.handle(request) .pipe( catchError((error: any) => { if (error.status !== 401) { return throwError(error) } return from(this.sessionService.refresh()) .pipe(map(() => next.handle(cloned))) }) ) } 的响应,如果它们是401,则捕获它们,执行刷新会话操作,然后再次尝试原始的HTTP调用(此外,如果再次遇到401s,则阻止其无限循环)< / p>

我想在下面的代码中执行的操作是使用http处理程序触发请求,订阅其事件,如果它在401上失败,则刷新然后返回可观察到的由处理程序操作的克隆请求。 / p>

{{1}}

关于如何实现自己想要达到的目标的任何建议?

2 个答案:

答案 0 :(得分:0)

这可能是语法上的一些错误,因为我是通过手机编写的,但这应该可以帮助您入门

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (!request.url.startsWith('/api')) {
    return next.handle(request)
}

const cloned = request.clone()
return next.handle(request)
    .do((event: HttpEvent<any>) =>
        return from(this.sessionService.refresh())
               .pipe(map(() => next.handle(cloned)))
        }), (err: any) => {
             if (err instanceof HttpResponse) {
                  if(err.status === 401){
                       return throwError(error);
                  }
        }
    )
}

答案 1 :(得分:0)

答案是使用switctMap而不是map

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> 
{
    if (!request.url.startsWith('/api')) {
        return next.handle(request)
    }

    const cloned = request.clone()
    return next.handle(request)
        .pipe(
            catchError((error: any) => {
                if (error.status !== 401) {
                    return throwError(error)
                }
                return from(this.sessionService.refresh())
                    .pipe(switchMap(() => next.handle(cloned)))
        })
    )
}

但是,我选择了一种替代方法,即在请求发生之前检查是否有会话,并在需要时注入刷新操作。

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (
        !request.url.startsWith('/api') || 
        this.sessionService.isValid
    ) {
        return next.handle(request)
    }

    return from(this.sessionService.refresh())
        .pipe(switchMap(() => next.handle(request)))
}