什么是AngularJS拦截器的角度模拟解决方案

时间:2016-03-28 11:09:17

标签: angularjs typescript angular

我在过期时刷新access_token有问题。问题是几乎没有服务向服务器发出请求,我需要解决方案来处理所有这些服务,刷新令牌一次并重复它们。

2 个答案:

答案 0 :(得分:3)

你可以实现一个扩展Http的类:

@Injectable()
export class CustomHttp extends Http {
    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
        super(backend, defaultOptions);
    }

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {

        console.log('request...');

        return super.request(url, options);        
    }

    get(url: string, options?: RequestOptionsArgs): Observable<Response> {

        console.log('get...');

        return super.get(url, options);
    }
}

在引导您的应用程序时注册它:

bootstrap(AppComponent, [HTTP_PROVIDERS, ROUTER_PROVIDERS,
    provide(Http, {
        useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new CustomHttp(backend, defaultOptions),
        deps: [XHRBackend, RequestOptions]
    })
]);

这样您就可以拦截Angular2中的所有请求。

在此级别,您可以检查令牌到期日期并执行刷新令牌请求。 flatMap运算符将帮助您在此等待执行刷新令牌请求以执行trajet请求。

请将此代码视为示例:

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
   return me.authService
             .refreshAuthenticationObservable()
             //Use flatMap instead of map
             .flatMap((authenticationResult:AuthenticationResult) => {
                   if (authenticationResult.IsAuthenticated == true) {
                     // retry with new token
                     me.authService.setAuthorizationHeader(request.headers);
                     return super.request(url, request);
                   }
                   return Observable.throw(initialError);
    });
}

有关详细信息,请参阅此问题:

答案 1 :(得分:0)

Observable.forkJoin(
    this.http.get('/app/1').map((res:Response) => res.json()),
    this.http.get('/app/2').map((res:Response) => res.json())
).subscribe(
  data => {
    this.a = data[0]
    this.b = data[1]
    refreshToken();
  },
  err => console.error(err)
);