我需要在进行任何http调用之前检查JWT是否已过期。最好的方法是什么?
目前我使用拦截器对每个请求进行控制,但是如果JWT过期,我会得到一个异常,因为拦截器因为重定向而没有返回请求。
答案 0 :(得分:1)
以下是如何使用 JWT expiry
Interceptor
的示例
要遵循的步骤:
interceptor
到intercept
requests
next.handle(req).catch
token expiry
create token
方法并将该标记添加到headers
或
formdata
next.handle(newReq)
<强>拦截器:强>
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);
});