跨源请求在 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-Origin
和Access-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 中修复“跨源请求被阻止”[重复]