angular 6在拦截器内获取响应头
虽然angular 6 interceptor服务在chrome控制台网络选项卡中可用,但无法在其内部检索响应标题。我找到了许多相同的解决方案并添加了所有响应标题,但什么都没有发生。我在node.js服务器中添加了angular 6在拦截器内获取响应头,angular,interceptor,Angular,Interceptor,虽然angular 6 interceptor服务在chrome控制台网络选项卡中可用,但无法在其内部检索响应标题。我找到了许多相同的解决方案并添加了所有响应标题,但什么都没有发生。我在node.js服务器中添加了访问控制公开头 res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST'); res.setHeader('Access-Co
访问控制公开头
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization,Auth');
res.setHeader('Access-Control-Expose-Headers', 'Autho')
我还在RESTAPI中使用HTTPClient
模块
Interceptor.ts文件:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = sessionStorage.getItem('data');
const id = sessionStorage.getItem('id');
const re = '/login';
// if( !token)
console.log(request.url);
// console.log(new URL(request.url).searchParams.get('userId'));
if (request.url.search(re) === -1) {
request = request.clone({
setHeaders: {
Authorization: token,
Auth: id
}
});
}
return next.handle(request).do((event: HttpEvent<any>) => {
console.log(event);
if (event instanceof HttpResponse) {
// do stuff with response if you want
console.log(event.headers);
// console.log(response.headers);
// console.log(HttpResponse.Headers);
}
}, (err: any) => {
if (err instanceof HttpErrorResponse) {
console.log(err);
if (err.status === 400) {
// redirect to the login route
// or show a modal
console.log('ERROR');
window.location.href = this.messageService.API_ROOT;
}
}
});
}
服务器:
res.setHeader('Autho','xxxxxxxxxxxxx');
像这样添加标题。
如何在拦截器中获取'Autho'头字段我通过放置console.log(event.headers.get('Autho'))解决了这个问题console.log(event.headers)之后的内部拦截器文件代码>。我不知道确切的原因,但我认为angular正在进行一些延迟加载,它们只提供必要的数据,如Response body。因此,只有当我们请求一些数据,如使用get('Autho')
时,它们才会提供这些数据
更新的interceptor.ts:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = sessionStorage.getItem('data');
const id = sessionStorage.getItem('id');
const re = '/login';
// if( !token)
console.log(request.url);
// console.log(new URL(request.url).searchParams.get('userId'));
if (request.url.search(re) === -1) {
request = request.clone({
setHeaders: {
Authorization: token,
Auth: id
}
});
}
return next.handle(request).do((event: HttpEvent<any>) => {
console.log(event);
if (event instanceof HttpResponse) {
// do stuff with response if you want
console.log(event.headers);
const jwt = event.headers.get('Autho');
console.log(jwt);
// console.log(response.headers);
// console.log(HttpResponse.Headers);
}
}, (err: any) => {
if (err instanceof HttpErrorResponse) {
console.log(err);
if (err.status === 400) {
// redirect to the login route
// or show a modal
console.log('ERROR');
window.location.href = this.messageService.API_ROOT;
}
}
});
}
intercept(请求:HttpRequest,下一步:HttpHandler):可观察{
const token=sessionStorage.getItem('data');
const id=sessionStorage.getItem('id');
常量re='/login';
//如果(!令牌)
log(request.url);
//log(新的URL(request.URL).searchParams.get('userId');
if(request.url.search(re)=-1){
request=request.clone({
集合标题:{
授权:令牌,
身份:id
}
});
}
返回next.handle(request).do((事件:HttpEvent)=>{
console.log(事件);
if(HttpResponse的事件实例){
//如果你想的话,做一些有回应的事情
日志(event.headers);
const jwt=event.headers.get('Autho');
控制台日志(jwt);
//console.log(response.headers);
//log(HttpResponse.Headers);
}
},(错误:任何)=>{
if(HttpErrorResponse的错误实例){
控制台日志(err);
如果(错误状态===400){
//重定向到登录路径
//或显示模态
console.log('ERROR');
window.location.href=this.messageService.API_ROOT;
}
}
});
}
我遇到了同样的问题,这篇文章是谷歌的第一篇回复,但没有包含我认为正确的答案。不知道OP是如何让它与他们的解决方案一起工作的。事实证明,由于HttpClient使用的是XmlHttpRequest,因此需要有一个“控制”头,以允许angular看到Chrome Network可以看到的头。这篇文章的详细内容如下:
我将它添加到我的express后端,一切都如预期的那样工作(我正在做一件与@Subham尝试的事情非常相似的事情)
这是Angular 9.0.4
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = sessionStorage.getItem('data');
const id = sessionStorage.getItem('id');
const re = '/login';
// if( !token)
console.log(request.url);
// console.log(new URL(request.url).searchParams.get('userId'));
if (request.url.search(re) === -1) {
request = request.clone({
setHeaders: {
Authorization: token,
Auth: id
}
});
}
return next.handle(request).do((event: HttpEvent<any>) => {
console.log(event);
if (event instanceof HttpResponse) {
// do stuff with response if you want
console.log(event.headers);
const jwt = event.headers.get('Autho');
console.log(jwt);
// console.log(response.headers);
// console.log(HttpResponse.Headers);
}
}, (err: any) => {
if (err instanceof HttpErrorResponse) {
console.log(err);
if (err.status === 400) {
// redirect to the login route
// or show a modal
console.log('ERROR');
window.location.href = this.messageService.API_ROOT;
}
}
});
}