angular6 拦截器陷入死循环

最近项目在使用angular6开发,封装了一个HttpInterceptor的拦截器,但是一直是报错的。。

auth.service.ts 里面的代码

import {Injectable} from '@angular/core';
import {HttpService} from './services/http.service';


@Injectable()
export class AuthService {
  public timestamp: any = '';

  constructor(private http: HttpService) {

  }

  /*
  * 动态获取时间戳做验证
  * */
  getTimestamp() {
    this.http.getData('/common/timestamp').subscribe((respData: any) => {
        if (respData.code === '0000') {
          this.timestamp = respData.data;
        }
      }
    );
  }


  //test用的
  getAuthorizationToken() {
    return 'some-auth-token';
  }
}

interceptor.service.ts

import {Injectable} from '@angular/core';
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from '@angular/common/http';
import {Observable} from 'rxjs';
import {tap} from 'rxjs/operators';

import {constant} from '../../providers';
import {AuthService} from '../auth.service';


@Injectable()
export class InterceptorService implements HttpInterceptor {


  constructor(private authService: AuthService) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    // const authToken = this.authService.getTimestamp(); //这个代码放开的话,就陷入死循环
    const authToken = this.authService.getAuthorizationToken();
    const clonedRequest = req.clone({
      setHeaders: {
        leo: 'test',
        version: constant.VERSIONS,
      },
    });
    console.log(clonedRequest.method);
    return next.handle(clonedRequest).pipe(
      tap(
        event => {
          if (event instanceof HttpResponse) {
            console.log(event);
          }
        },
        error => {
          console.error(error.message);
        }
      )
    );
  }
}

如果我把interceptor.service.ts里面的const authToken = this.authService.getTimestamp();放开,就会陷入循环。
图片描述

我想在拦截器的header请求头里面加个时间戳做验证,这个时间戳必须是post请求的时候从后台重新获取,现在是不知道怎么解决了?有谁知道吗?谢谢

阅读 4.4k
2 个回答

拦截器判断url /common/timestamp 直接放行

export class InterceptorService implements HttpInterceptor {
  private lastTimestamp;

  constructor(private authService: AuthService) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const authToken;
    if (req.url !== '/common/timestamp'){
        authToken = this.authService.getTimestamp();        
        this.lastTimestamp = authToken;
    } else { // 这里复用上次时间也可以不要
        authToken = this.lastTimestamp;
    }
    const clonedRequest = req.clone({
      setHeaders: {
        leo: 'test',
        version: constant.VERSIONS,
      },
    });
    console.log(clonedRequest.method);
    return next.handle(clonedRequest).pipe(
      tap(
        event => {
          if (event instanceof HttpResponse) {
            console.log(event);
          }
        },
        error => {
          console.error(error.message);
        }
      )
    );
  }
}
if (req.url==='获取token的请求路径') {
  
     return next.handle(req);
    
   }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题