刷新access_token过期时遇到问题。问题是很少有服务一次向服务器发送请求,我需要解决方案来处理所有这些服务,刷新令牌一次并重复它们。Angular 2拦截器的Angular 2模拟解决方案是什么
1
A
回答
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操作符将帮助您在此等待执行刷新令牌请求以执行传输请求。
看到这个代码示例:
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);
});
}
详情请参见这个问题:
+0
嗨,蒂埃里,代码----返回me.authService ----这个会在哪里,为什么这需要一个自定义的http实现? – shiv
+0
嘿嘿。我们需要一个自定义的http类来透明地截取所有请求,而无需更新现有的代码(http调用)。你是对的“返回me.authService ...”。我更新了答案。 –
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)
);
相关问题
- 1. Angular 2模型(ORM)解决方案
- 2. Angular 2:解决querylist?
- 3. Ionic/Angular 2倒数计时器解决方案
- 4. Angular 2模板中的let *是什么?
- 5. Angular 2 Provider的模拟
- 6. Angular $ .grep()方法的Angular 2中的等价方法是什么?
- 7. Angular 2 - 解决keyUp事件
- 8. Angular 2:讨论实现的现有解决方案
- 9. Angular 2组件中'controllerAs'指令属性的模拟是什么?
- 10. Angular 4 - HTTP拦截器
- 11. 测试Angular http拦截器
- 12. Angular http拦截器配置
- 13. 混合内容拦截解决方案
- 14. 在Angular 2中制作模态的最好方法是什么?
- 15. Angular 2中的组件是什么
- 16. Angular 2 - 什么是可声明的?
- 17. Angular 2中的A2tUiModule是什么?
- 18. 什么是$ scope.watch的Angular 2等价物?
- 19. 模拟Angular 2中的长响应
- 20. 2个网站的最佳解决方案是什么
- 21. 为什么Angular 2使用装饰器?
- 22. Angular选择退出拦截器行为
- 23. Angular 2 - 什么是DI错误?
- 24. Angular 2:什么是@ Input/@输出别名?
- 25. Angular 2 TS和Angular 2 Dart有什么区别?
- 26. 解决失败时重定向Angular 2
- 27. 如何模拟Angular 2路线?
- 28. angular 2打字稿类库模拟
- 29. Angular $ httpProvider拦截器和$资源
- 30. Angular 4.3 HttpClient:拦截响应
要再次通过服务获得新的刷新令牌呼叫服务(当刷新令牌到期时)? –