Angular 2拦截器的Angular 2模拟解决方案是什么
刷新access_token过期时遇到问题。问题是很少有服务一次向服务器发送请求,我需要解决方案来处理所有这些服务,刷新令牌一次并重复它们。Angular 2拦截器的Angular 2模拟解决方案是什么
你可以实现一个扩展了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操作符将帮助您在此等待执行刷新令牌请求以执行传输请求。
看到这个代码示例:
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);
});
}
详情请参见这个问题:
嗨,蒂埃里,代码----返回me.authService ----这个会在哪里,为什么这需要一个自定义的http实现? – shiv
嘿嘿。我们需要一个自定义的http类来透明地截取所有请求,而无需更新现有的代码(http调用)。你是对的“返回me.authService ...”。我更新了答案。 –
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)
);
要再次通过服务获得新的刷新令牌呼叫服务(当刷新令牌到期时)? –