javascript - 用于身份验证标头的 Angular HTTP 拦截器
问题描述
我必须在每个 HTTP 请求的“授权”标头中放置一个令牌。所以我开发并注册了一个 HttpInterceptor :
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
constructor(public authService: AuthService) {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let modifiedReq;
const token = this.authService.getToken();
// we need the heck clone because the HttpRequest is immutable
// https://angular.io/guide/http#immutability
if (token) {
modifiedReq = request.clone();
modifiedReq.headers.set('Authorization', `Bearer ${token}`);
}
return next.handle(modifiedReq ? modifiedReq : request).pipe(tap(() => {
// do nothing
},
(err: any) => {
if (err instanceof HttpErrorResponse) {
if (err.status === 0) {
alert('what the heck, 0 HTTP code?');
}
if (err.status !== 401) {
return;
}
this.authService.goToLogin();
}
}));
}
}
但是标头似乎永远不会放在发送的请求上。我究竟做错了什么?
此外,有时拦截器会捕获错误代码“0”;这是什么意思?
角 8.2.11
编辑1:------------
我也试过这样:
request = request.clone({
setHeaders: {
authorization: `Bearer ${token}`
}
});
但仍然没有设置标题。此外,该模块已在 app.module 中正确注册
providers: [{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptor ,
multi: true,
}..
编辑 2:------------
检查这张图片......我快疯了。
解决方案
也许你忘了把app.module
这个:
providers: [{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptor ,
multi: true,
}..
最后一部分这样写:
return next.handle(modifiedReq);
推荐阅读
- python - 循环遍历多个 CSV 文件
- git - 无法将文件夹添加到 git repo
- java - 创建 HermiT 实例时出现 NoSuchMethodError
- php - 在订单视图列 WooCommerce 中显示自定义字段值
- java - 没有在 IntelliJ IDEA 中获取 lambda 表达式的断点选项
- tensorflow - TensorFlow 梯度 wrt 在 while_loop 主体内的中间结果
- c - C试图修复无限循环
- javascript - 用javascript读取一个孩子的孩子的内容
- python - Django:如何在模板中调用“包含”函数?
- javascript - 反应:setState 没有再次呈现页面