从 http 网页请求本地资源时响应为 401 错误

Posted

技术标签:

【中文标题】从 http 网页请求本地资源时响应为 401 错误【英文标题】:Response is a 401 error when requesting local resource from http webpage 【发布时间】:2019-05-21 22:37:19 【问题描述】:

Chrome 正在抛出

XMLHttpRequest 无法加载 http://127.0.0.1:8006/test 请求中不存在 'Access-Control-Allow-Origin' 标头 资源。 因此,Origin 'http://xxx.yyy.com' 不允许访问。 响应的 HTTP 状态代码为 401。

我正在使用 HTTP 打开一个弹出窗口并向 Java 创建的本地 HTTP 服务器发出请求。

它在所有机器上都可以正常工作,除了在某些不同的机器上,浏览器会抛出上述错误。

根据我的理解,在HTTPHTTP 出现这个错误有点奇怪。

【问题讨论】:

问题不在于缺少 Access-Control-Allow-Origin 标头。当响应是错误而不是成功消息时,这是预期的。实际问题是响应是 401 而不是 200 OK。而且响应是 401 的事实与服务器中的 CORS 配置完全没有关系。 【参考方案1】:

一点也不奇怪——127.0.0.1:8006xxx.yyy.com 是不同的来源,Java 服务器没有发送 Access-Control-Allow-Origin 标头来告诉浏览器没问题。

更多详情https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

基本上,Java 服务器需要添加带有允许的 CORS 来源或通配符(允许任何来源)的 Access-Control-Allow-Origin 标头:

Access-Control-Allow-Origin: * Access-Control-Allow-Origin: http://xxx.yyy.com(包括协议,因为http和https在浏览器眼里是不同的来源)

【讨论】:

Allow Origin 和 Allow Headers 都已经存在。如果没有,每台机器上都应该出现同样的问题。我尝试在同一台机器上向 Chrome Poster 请求相同的资源并且它正在工作。 allow-origin 标头中的值是什么?能否请您在 devtools 或该海报扩展程序中截取请求详细信息?【参考方案2】:

您必须在调用该 URL 以实现 Web 服务的服务器端添加标头。 This 将帮助您了解标头是如何在 java 中添加的。

例如:

.header("Access-Control-Allow-Origin", "*")

如果您仍然想避免cross origin 错误。在这种情况下,我建议您将此扩展程序与 chrome 一起使用:Chrome extension for cors

这将帮助您避免浏览器中的跨源错误,仅在您的机器中用于开发目的。

【讨论】:

Allow Origin 和 Allow Headers 都已经存在。如果没有,每台机器上都应该出现同样的问题。我尝试在同一台机器上向 Chrome Poster 请求相同的资源并且它正在工作。

以上是关于从 http 网页请求本地资源时响应为 401 错误的主要内容,如果未能解决你的问题,请参考以下文章

http常见的状态码,400,401,403状态码 , http响应 ,php设置http响应

从 vuejs 客户端向 oauth/token 发送 POST 请求时的 401 响应

当服务器返回 401 响应时,请求的资源上不存在“Access-Control-Allow-Origin”标头

http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码

http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码

当 HTTP 请求返回状态 401 时,如何在 Java 中解析响应正文