Javascript 侦听器在登录angular7应用程序后抛出错误?
我有一个Javascript 侦听器在登录angular7应用程序后抛出错误?,javascript,angular,typescript,angular-http-interceptors,Javascript,Angular,Typescript,Angular Http Interceptors,我有一个angular7应用程序,其中有多个模块和服务。我有node.js后端和jwt身份验证机制。当令牌在客户端过期时,所以后端向客户端发送405错误响应 现在在客户端,我实现了interceptor,以获得405错误并重定向到login。这是我的拦截器代码 intercept(request: HttpRequest<any>, next): Observable<HttpEvent<any>> { console.log(this.localCa
angular7
应用程序,其中有多个模块和服务。我有node.js
后端和jwt
身份验证机制。当令牌在客户端过期时,所以后端向客户端发送405错误响应
现在在客户端,我实现了interceptor
,以获得405
错误并重定向到login。这是我的拦截器代码
intercept(request: HttpRequest<any>, next): Observable<HttpEvent<any>> {
console.log(this.localCache.getToken(), 'token')
return next.handle(request).pipe(
tap(event => {
if (event instanceof HttpResponse) {
console.log('succeed');
}
}, error => {
if (error.status == 405) {
this.appService.navigateToView(Constants.VIEW_ROUTES.LOGIN);
this.localCache.setTokeExpireErrorMsg('Session Expired');
}
return Observable.throw(error);
})
)
}
intercept(请求:HttpRequest由于每个API调用都会通过侦听器,因此可以检查令牌是否仍然有效,继续API调用
如果令牌过期,请重定向到login并阻止任何进一步的API调用
试着这样做:
intercept(req, next) {
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 {
return next.handle(req).catch(err => {
console.log(err);
if (err.status === 405) {
console.log('in if')
localStorage.clear();
this.appService.navigateToView(Constants.VIEW_ROUTES.LOGIN)
this.localCache.setTokeExpireErrorMsg('Session has expired, please login agian')
}
return Observable.throw(err);
}
}
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');
}
我应该把这个拦截器放在我每个模块的提供者数组中吗?不,如果你只把它放在app.module中就完全可以了,我希望如果本地存储中没有令牌,那么在这种情况下,用户也应该被重定向到登录。那么我该如何实现呢?另外,请查看session-service.ts y中的isTokenExpired
方法您正在两个ifs中检查相同的条件。if(token==null&&this.sessionService.isTokenExpired())
thanx,让我试试您的想法。我现在正在实现它。