Angular 用于身份验证的 HTTP 拦截器 header
Angular HTTP interceptor for Authentication header
我必须为每个 HTTP 请求在 'Authorization' header 中放置一个令牌。
所以我开发并注册了一个 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();
}
}));
}
}
但是header似乎永远不会放在发送的请求上。我做错了什么?
此外,有时拦截器会捕获错误代码“0”;这是什么意思?
Angular 8.2.11
编辑 1:------------------------
我也这样试过:
request = request.clone({
setHeaders: {
authorization: `Bearer ${token}`
}
});
但仍未设置 header。
此外,该模块已在 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);
它对我来说是这样的:
const headersConfig = {
'Accept': 'application/json', //default headers
};
...
if (token) {
headersConfig['Authorization'] = `Bearer ${token}`;
}
...
return next
.handle(request.clone({
setHeaders: headersConfig
}))
我错了。在更新克隆请求时,angular 会将新的 headers 放在名为“lazyUpdate”的字段中,而不是直接放在 headers 中。
由于其他原因,请求失败。
我必须为每个 HTTP 请求在 'Authorization' header 中放置一个令牌。 所以我开发并注册了一个 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();
}
}));
}
}
但是header似乎永远不会放在发送的请求上。我做错了什么?
此外,有时拦截器会捕获错误代码“0”;这是什么意思?
Angular 8.2.11
编辑 1:------------------------
我也这样试过:
request = request.clone({
setHeaders: {
authorization: `Bearer ${token}`
}
});
但仍未设置 header。 此外,该模块已在 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);
它对我来说是这样的:
const headersConfig = {
'Accept': 'application/json', //default headers
};
...
if (token) {
headersConfig['Authorization'] = `Bearer ${token}`;
}
...
return next
.handle(request.clone({
setHeaders: headersConfig
}))
我错了。在更新克隆请求时,angular 会将新的 headers 放在名为“lazyUpdate”的字段中,而不是直接放在 headers 中。 由于其他原因,请求失败。