ionic 3与angular 5 Http侦听器重试请求不起作用
我正在使用刷新令牌进行令牌身份验证。我已经在web应用程序中成功地在angular v1中实现了身份验证和刷新令牌。在使用angular v5的ionic 3应用程序中,我也实现了该过程。它正在通过刷新令牌成功获取新令牌。但问题是,它不会再次调用最后一个请求 这是我的Http拦截器实现ionic 3与angular 5 Http侦听器重试请求不起作用,angular,typescript,ionic-framework,ionic3,angular-http-interceptors,Angular,Typescript,Ionic Framework,Ionic3,Angular Http Interceptors,我正在使用刷新令牌进行令牌身份验证。我已经在web应用程序中成功地在angular v1中实现了身份验证和刷新令牌。在使用angular v5的ionic 3应用程序中,我也实现了该过程。它正在通过刷新令牌成功获取新令牌。但问题是,它不会再次调用最后一个请求 这是我的Http拦截器实现 @Injectable() export class HttpsRequestInterceptor implements HttpInterceptor { isRefreshingToken: boolean
@Injectable()
export class HttpsRequestInterceptor implements HttpInterceptor {
isRefreshingToken: boolean = false;
tokenSubject: BehaviorSubject<string> = new BehaviorSubject<string>(null);
constructor(
private injector : Injector
) {
}
addToken(req: HttpRequest<any>, token: string): HttpRequest<any> {
return req.clone({ setHeaders: { Authorization: 'Bearer ' + token }})
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
const authenticationService = this.injector.get(AuthenticationService);
let user : AuthenticatedUser = authenticationService.getUser1();
console.log("token", (user)? user.token : null);
let dupReq: HttpRequest<any>;
if (user && req.urlWithParams.indexOf("/token") < 0) {
dupReq = this.addToken(req, user.token);
} else {
dupReq = req;
}
return next.handle(dupReq).pipe(
tap(event => {
if (event instanceof HttpResponse) {
console.log(`Request for ${dupReq.urlWithParams} return status text : ${event.statusText} .`);
}
}, error => {
if (error instanceof HttpErrorResponse) {
switch ((<HttpErrorResponse>error).status) {
case 401:
return this.handle401Error(dupReq, next);
}
} else{
return Observable.throw(error);
}
})
)
}
handle401Error(req: HttpRequest<any>, next: HttpHandler) {
if (this.isRefreshingToken == false) {
this.isRefreshingToken = true;
this.tokenSubject.next(null);
const authenticationService = this.injector.get(AuthenticationService);
return authenticationService.refreshToken().then((result: ResultSet) =>{
this.isRefreshingToken = false;
if (result.isSuccess) {
console.log(result.message, result.model.token);
let user: AuthenticatedUser = result.model;
this.tokenSubject.next(user.token);
return next.handle(this.addToken(req, user.token));
}
// TODO logout.
}).catch((error: ResultSet) =>{
this.isRefreshingToken = false;
// TODO logout.
});
} else {
return this.tokenSubject
.filter(token => token != null)
.take(1)
.switchMap(token => {
return next.handle(this.addToken(req, token));
});
}
}};
@Injectable()
导出类HttpsRequestInterceptor实现HttpInterceptor{
isRefreshingToken:boolean=false;
tokenSubject:BehaviorSubject=新的BehaviorSubject(null);
建造师(
专用注射器:注射器
) {
}
addToken(请求:HttpRequest,标记:string):HttpRequest{
return req.clone({setHeaders:{Authorization:'Bearer'+token}})
}
截取(req:HttpRequest,next:HttpHandler):可观察{
const authenticationService=this.injector.get(authenticationService);
让用户:AuthenticatedUser=authenticationService.getUser1();
console.log(“token”,(user)?user.token:null);
让dupReq:HttpRequest;
if(user&&req.urlWithParams.indexOf(“/token”)<0){
dupReq=这个.addToken(req,user.token);
}否则{
dupReq=req;
}
返回next.handle(dupReq).pipe(
点击(事件=>{
if(HttpResponse的事件实例){
log(`Request for${dupReq.urlWithParams}返回状态文本:${event.statusText}.`);
}
},错误=>{
if(HttpErrorResponse的错误实例){
开关((错误)。状态){
案例401:
返回此.handle401Error(dupReq,next);
}
}否则{
返回可观察抛出(错误);
}
})
)
}
handle401Error(请求:HttpRequest,下一个:HttpHandler){
if(this.isRefreshingToken==false){
this.isRefreshingToken=true;
this.tokenSubject.next(null);
const authenticationService=this.injector.get(authenticationService);
返回authenticationService.refreshToken()。然后((结果:ResultSet)=>{
this.isRefreshingToken=false;
如果(结果。发布成功){
日志(result.message、result.model.token);
让用户:AuthenticatedUser=result.model;
this.tokenSubject.next(user.token);
返回next.handle(this.addToken(req,user.token));
}
//TODO注销。
}).catch((错误:ResultSet)=>{
this.isRefreshingToken=false;
//TODO注销。
});
}否则{
返回此.tokenSubject
.filter(令牌=>令牌!=null)
.采取(1)
.switchMap(令牌=>{
返回next.handle(this.addToken(req,token));
});
}
}};
任何人都知道为什么拦截器不再重复上一个请求
谢谢没有人知道问题出在哪里?在这种情况下,你需要重试?你有一个疯狂的rx和承诺的组合,尝试使用rx让一切变得更加明显,很难说这些承诺和rx是怎样的interacts@PareshGami在我调用refreshToken并获取新令牌之后,然后我想重试上一个http请求。您似乎在
点击中进行了错误处理?为此,您应该使用catchError
。。