【发布时间】:2019-09-28 02:52:31
【问题描述】:
当 JWT 令牌过期时,Web 应用程序应显示alert 或模式弹出窗口,然后它应重定向到登录页面。目前我正在使用烤面包机消息。
我的组件中有许多 api 调用。我收到许多烤面包机消息“令牌已过期”。我应该只显示一条消息并重定向到登录页面。告诉我你的好主意。我在网上有一些文章。但我无法清楚地了解这些内容。
import {
HttpEvent,
HttpInterceptor,
HttpHandler,
HttpRequest,
HttpResponse,
HttpErrorResponse
} from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { retry, catchError } from 'rxjs/operators';
import { Router } from '@angular/router';
import { ToastrManager } from 'ng6-toastr-notifications';
import { Injectable } from '@angular/core';
import { JwtDecoderService } from './jwt-decoder.service';
@Injectable()
export class HttpErrorInterceptor implements HttpInterceptor {
constructor(public router: Router,
public toastr: ToastrManager,
private jwtDecoder: JwtDecoderService, ) {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (localStorage.getItem('isLoggedin') === 'false' && !this.jwtDecoder.isTokenExpired()) {
this.toastr.warningToastr('Token expired');
return;
}
return next.handle(request)
.pipe(
catchError((error: HttpErrorResponse) => {
let errorMessage = '';
if (error.error instanceof ErrorEvent) {
// client-side error
errorMessage = `Error: ${error.error.message}`;
} else {
// server-side error
errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`;
if (error.status === 404) {
this.toastr.warningToastr('Server Not Found');
this.router.navigate(['/login']);
}
if (error.status === 412) {
this.toastr.warningToastr('Token expired');
this.router.navigate(['/login']);
}
// if (error.status === 500 || error.status === 400) {
// this.toastr.errorToastr('We encountered a technical issue');
// }
}
// return throwError(errorMessage);
return throwError(error);
})
);
}
}
【问题讨论】:
-
为什么不在你的第一个分支中使用
router.navigate,而不仅仅是return?更简洁的方法是在特定服务中排除这种行为,这样你总是调用相同的行为,而不是在多个分支中复制它。 -
由于您的所有 API 都使用 JWT 令牌进行身份验证,因此最好先检查令牌的有效性,然后再进行其他 API 调用。
标签: javascript angular angular7 angular-http-interceptors