在http订阅Angular之前做一些检查

时间:2018-05-28 07:46:18

标签: angular http

我需要在进行任何http调用之前检查JWT是否已过期。最好的方法是什么?

目前我使用拦截器对每个请求进行控制,但是如果JWT过期,我会得到一个异常,因为拦截器因为重定向而没有返回请求。

2 个答案:

答案 0 :(得分:1)

以下是如何使用 JWT expiry

处理 Interceptor 的示例

要遵循的步骤:

  1. 创建interceptorintercept requests
  2. 使用next.handle(req).catch
  3. 处理api中的错误
  4. 检查错误状态并发送特定的状态代码  token expiry
  5. 调用create token方法并将该标记添加到headers或  formdata
  6. 使用next.handle(newReq)
  7. 召回请求

    <强>拦截器:

    import { Injectable } from '@angular/core';
    import {
      HttpInterceptor,
      HttpHandler,
      HttpRequest,
      HttpResponse,
      HttpErrorResponse,
      HttpParams
    } from '@angular/common/http';
    import { Observable } from 'rxjs/Observable';
    import 'rxjs/add/operator/do';
    import 'rxjs/add/operator/catch';
    import 'rxjs/add/observable/throw';
    import 'rxjs/add/operator/mergeMap';
    
    import { YourService } from './your.service';
    
    @Injectable()
    export class AppInterceptor implements HttpInterceptor {
      constructor(private yourService: YourService) { }
      intercept(
        req: HttpRequest<any>,
        next: HttpHandler
      ): Observable<any> {
        return next.handle(req).catch((event): any => {
          if (event instanceof HttpErrorResponse) {
            if (
              event.status == 'some status for token expiry'
            ) {
              return this.yourService.createToken().flatMap((res: any): any => {
                  const token = res.data.ws_token;
                  // send something with token and send request again   
                  // set headers
                   let headers = new Headers();
                   headers.append('Authorization', token);
                  const newReq = req.clone();
                  return next.handle(newReq)
              }, err => {
                console.log(err)
                  return Observable.throw(event);
              });
    
            }
          } else {
            return Observable.throw(event);
          }
          return Observable.throw(event);
        })
      }
    }
    

答案 1 :(得分:-1)

重定向并不意味着您应该停止返回请求。

考虑重定向,然后返回错误。

return next
  .handle(request)
  .catch(err => {
    this.router.navigate(['/login']);
    return Observable.throw(err);
  });