Вы можете использовать HttpInterceptor . Поскольку каждый вызов API проходит через перехватчик, вы можете проверить, является ли токен все еще действительным, перейти к вызову API
Если токен истек, покажите предупреждение toastr и предотвратите дальнейшие вызовы API.
Для получения дополнительной информации об использовании перехватчика, посетите этот 10 способов использования перехватчиков и Angular 7 JWT Interceptor
Полный код:
HTTP-interceptor.service.ts
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { SessionService } from './session.service';
import { Router } from '@angular/router';
import { throwError } from 'rxjs';
declare var toastr;
@Injectable({
providedIn: 'root'
})
export class HttpInterceptorService implements HttpInterceptor {
constructor(private router: Router, private sessionService: SessionService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
var token = this.sessionService.getToken();
if (token != null && this.sessionService.isTokenExpired()) {
this.sessionService.logOut()
toastr.warning("Session Timed Out! Please Login");
this.router.navigate(['/login'])
return throwError("Session Timed Out")
} else {
const authRquest = req.clone({
setHeaders: {
Authorization: 'Bearer ' + token
}
})
return next.handle(authRquest)
.pipe(
tap(event => {
}, error => {
})
)
}
}
}
app.module.ts
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: HttpInterceptorService,
multi: true
}
]
SESSION-service.ts
getToken(): string {
return localStorage.getItem('userToken');
}
getTokenExpirationDate(token: string): Date {
token = this.getToken()
const decoded = jwt_decode(token);
if (decoded.exp === undefined) return null;
const date = new Date(0);
date.setUTCSeconds(decoded.exp);
return date;
}
isTokenExpired(token?: string): boolean {
if (!token) token = this.getToken();
if (!token) return true;
const date = this.getTokenExpirationDate(token);
if (date === undefined) return false;
return !(date.valueOf() > new Date().valueOf());
}
logOut(loginType?: string) {
localStorage.removeItem('isLoggedin');
localStorage.removeItem('userRole');
}