在AngularHTTPInterceptor的几种使用场景中,最常见的是为出站HTTP请求添加Authorization头字段。下面的示例应用程序有一个生成授权令牌的AuthService。在AuthInterceptor中注入服务以获取令牌并向每个传出请求添加带有该令牌的授权标头:import{AuthService}from'../auth.service';@Injectable()exportclassAuthInterceptorimplementsHttpInterceptor{constructor(privateauth:AuthService){}intercept(req:HttpRequest,next:HttpHandler){//从服务获取授权令牌。constauthToken=this.auth.getAuthorizationToken();//克隆请求并用//克隆的标头替换原始标头,并使用授权进行更新。constauthReq=请求。clone({headers:req.headers.set('Authorization',authToken)});//将带有标头的克隆请求发送到下一个处理程序。返回next.handle(authReq);}}当然,上面先clone请求,再设置字段,还有更简洁的写法://Clonetherequestandsetthenewheaderinonestep.constauthReq=req.clone({setHeaders:{授权:authToken}});SAPSpartacus的Angular代码也采用了上述思路。举个例子:AuthHttpHeaderService类是AuthInterceptor的一个服务类:我们查看alterRequest方法的注解可知,其作用是为OCCAPI调用的HTTP请求添加Authorization字段。首先调用147行的getAuthorizationHeader方法判断当前请求对象request:该方法的实现源码:protectedgetAuthorizationHeader(request:HttpRequest):string|null{constrawValue=request.headers.get('授权');返回原始值;因为如果请求头已经有了Authorization字段,我们就不应该再继续添加了。isOccUrl的实现代码:protectedisOccUrl(url:string):boolean{returnurl.includes(this.occEndpoints.getBaseUrl());如果请求url包含OCC端点并且没有添加授权字段,则输入代码150行,添加访问令牌。方法createAuthorizationHeader接收到的参数token类型为AuthToken,是接口的一个字段列表:interface:exportinterfaceAuthToken{/***Tokenusedfor`Authorization`header。*/access_token:字符串;/***token过期时刷新`access_token`。*/refresh_token?:字符串;/***`access_token`过期的时间。*/expires_at?:字符串;/***OAuth服务器授予的范围。*/granted_scopes?:string[];/***从OAuth服务器获取并保存`access_token`的时间。*/access_token_stored_at:string;/***`access_token`的类型。最常见的是“Bearer”。*/token_type?:string;}可以看出,AuthToken接口中不仅包含了AccessToken,还包含了它的超时时间和刷新令牌的值。但是对于我们现在的场景,我们只需要关心access_token这个字段即可。如下图所示,三个关键点如下:首先检查token入参的字段access_token,如果有则直接返回该字段值;如果access_token字段不可用,则从Ngrx的内存存储中读取,赋值给临时变量currentToken,并将currentToken的值返回给调用者