Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 侦听器在登录angular7应用程序后抛出错误?_Javascript_Angular_Typescript_Angular Http Interceptors - Fatal编程技术网

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,让我试试您的想法。我现在正在实现它。