Han*_* CR 12 interceptor typescript angular angular-httpclient
我想用拦截器排除一些服务.
app.module.js
providers: [
UserService,
RolesService,
{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptor,
multi: true
},
],
Run Code Online (Sandbox Code Playgroud)
Login.service.ts
return this.httpClient.post(this.appUrl + '/oauth/token', body.toString(), { headers, observe: 'response' })
.map((res: Response) => {
const response = res.body;
this.storeToken(response);
return response;
})
.catch((error: any) => {
ErrorLogService.logError(error);
return Observable.throw(new Error(error.status));
});
}
Run Code Online (Sandbox Code Playgroud)
Dra*_*tor 33
虽然#Fussel的答案(上图)有效,但在每个组件模块中包含拦截器服务通常不是一个好习惯.这是反直觉和反效果的.我们希望拦截器在一个地方,并适用于所有http请求.一种方法是基于url排除intercept()函数中的头绑定.
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const re = /login/gi;
// Exclude interceptor for login request:
if (req.url.search(re) === -1 ) {
req = req.clone({
setHeaders: {
Authorization: `Bearer ${localStorage.getItem('authToken')}`
}
});
}
return next.handle(req);
Run Code Online (Sandbox Code Playgroud)
}
不仅要根据要求在评论中给出答案;-)
要从拦截器中排除某些服务(甚至在不同组件中使用的相同服务),最好将您的应用程序拆分为模块,并仅在需要时才在模块中提供拦截器。例如,登录后或在管理区域内。
甚至可以使用@Component声明的providers属性为单个组件提供拦截器。
| 归档时间: |
|
| 查看次数: |
10576 次 |
| 最近记录: |