跨源请求在 tomcat 8 中被阻止,HTTP 状态代码为 403

Posted

技术标签:

【中文标题】跨源请求在 tomcat 8 中被阻止,HTTP 状态代码为 403【英文标题】:cross origin requests are blocked in tomcat 8 with HTTP status code 403 【发布时间】:2016-12-02 00:57:04 【问题描述】:

这似乎是一个已知问题,并且该主题存在许多问题,但是,我的情况很奇怪。我有一个部署在 tomcat 8.0.36 上的简单 Web 应用程序。我已经正确配置了 CORS:

<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

跨域请求被浏览器拦截:

请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'https://www.mytestpage.com' 不允许访问。响应的 HTTP 状态代码为 403。

在 tomcat 日志文件中我还看到了 403 的响应代码。有趣的是,我的应用程序的代码在跨域请求的情况下永远不会执行。请求在到达我的应用程序之前被阻止,并立即发送 403。我在tomcat前面没有apache,它是普通的tomcat。我已经尝试了很多事情,包括将来源列入白名单和指定允许的标头 - 没有任何帮助。我还尝试以编程方式设置标头,直到发现跨域请求的代码从未执行。

UPD:端点接受 POST 请求。这些 POST 请求作为 XmlHttpRequests 从 JS sn-p 发送。

有什么想法吗?

p.s 我可以成功提出同源请求。

【问题讨论】:

您好,您在 CorsFilter 配置中使用默认值,所以问题可能出在所有问题上。例如 cors.allowed.methods 默认值是 GET, POST, HEAD, OPTIONS 并且可能在请求中 DELETE 正在尝试。你能发布更多细节吗? 我已经更新了这个问题。我正在发送 POST 请求。 请求被org.apache.catalina.filters.CorsFilter 拒绝。尝试调试它或将您的记录器设置为此类的调试级别。 是的,绝对是过滤器阻塞了请求。如何调试或将记录器放在这个特定的类上? 您使用什么 IDE、什么记录器、什么构建工具? 【参考方案1】:

我发现了问题所在 - 我必须在请求中设置 Content-Type 标头,否则请求将被阻止。 - Tomcat CORS filter

【讨论】:

【参考方案2】:

您实际上必须同时设置Access-Control-Allow-OriginAccess-Control-Allow-Methods。这是一个例子:

Access-Control-Allow-Origin: http://www.myhost.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE

您还必须接受返回两个Access-Control-Allow-* 标题行的“OPTIONS”方法。某些浏览器可能会在您实际请求(例如“PUT”请求)之前发出此类请求,以获取服务的访问信息。

【讨论】:

【参考方案3】:

我刚刚遇到了类似的情况。我通过为所有需要的 Web 应用程序使用相同的 Tomcat 服务器解决了这个问题。此外,我必须使用 tomcat 服务器的详细名称而不是 localhost。我没有看到更多 CORS 过滤器问题。

【讨论】:

以上是关于跨源请求在 tomcat 8 中被阻止,HTTP 状态代码为 403的主要内容,如果未能解决你的问题,请参考以下文章

跨源请求被阻止的 CORS - 使用角度 cli 解决 [仅限开发人员] [重复]

阻止跨源请求

如何使用 Ajax Api 在 Google Distance Matrix API 中修复“跨源请求被阻止”[重复]

仅在涉及文件上载/下载时阻止跨源请求

Angular2,REST 服务 POST 调用错误:“跨源请求被阻止”

跨源请求已阻止:同源策略禁止在某个URI上读取远程资源