【发布时间】:2016-12-24 06:21:46
【问题描述】:
我正在开发一个 Angular2 应用程序。似乎当我的访问令牌过期时,401 HTTP 状态代码在响应对象中更改为 0 值。我收到 401 Unauthorized 但 ERROR Response 对象的状态为 0。这阻止了我捕获 401 错误并尝试刷新令牌。是什么导致401 HTTP状态码变成了HTTP状态码0?
这是来自 Firefox 控制台的屏幕截图:
这是我的代码:
get(url: string, options?: RequestOptionsArgs): Observable<any>
{
//console.log('GET REQUEST...', url);
return super.get(url, options)
.catch((err: Response): any =>
{
console.log('************* ERROR Response', err);
if (err.status === 400 || err.status === 422)
{
return Observable.throw(err);
}
//NOT AUTHENTICATED
else if (err.status === 401)
{
this.authConfig.DeleteToken();
return Observable.throw(err);
}
else
{
// this.errorService.notifyError(err);
// return Observable.empty();
return Observable.throw(err);
}
})
// .retryWhen(error => error.delay(500))
// .timeout(2000, new Error('delay exceeded'))
.finally(() =>
{
//console.log('After the request...');
});
}
此代码驻留在扩展 Angular2 的 HTTP 的自定义 http 服务中,因此我可以在单个位置拦截错误。
在 Google Chrome 中,我收到以下错误消息:
XMLHttpRequest 无法加载 https://api.cloudcms.com/repositories/XXXXXXXXXXXXXXXX/branches/XXXXXXXXXXXXXXXX/nodesXXXXXXXXXXXXXXXX。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://screwtopmedia.local.solutiaconsulting.com' 不允许访问。响应的 HTTP 状态代码为 401。
这很令人困惑,因为我在请求中包含了“Access-Control-Allow-Origin”标头。
这是 Google Chrome 中收到的结果图片:
我尝试访问“WWW-Authenticate”响应标头作为捕获 401 的手段。但是,以下代码返回 NULL:
err.headers.get("WWW-Authenticate")
令人费解的是,我遇到了 CORS 问题,因为在提供有效的访问令牌时我没有收到任何 CORS 错误。
如何捕获 401 HTTP 状态代码?为什么 401 HTTP 状态码被改为 0?
感谢您的帮助。
【问题讨论】:
-
如果 cloudcms.com 没有在 401 响应中设置 Access-Control-Allow-Origin,那么您无能为力。您必须正确地向他们打开支持票以确认这是否是正常行为。如果发生 CORS 错误,我测试的浏览器中的 javascript(FF、Chrome 和 Safari)不会收到任何信息,除了状态 0。Angular2 无法控制它。
-
问题解决了吗?我的意思是在服务器不发送正确代码的情况下,但在 chrome 控制台上你会看到 401,但 angular 一直给 0 一样的状态?