2016-07-27 95 views
5

它看起来像一个已知的问题,并且在这个话题上存在很多问题,但是,我的情况非常奇怪。我有一个简单的web应用程序,部署在tomcat 8.0.36上。我已经正确配置了CORS:交叉来源请求在tomcat 8中被阻止

<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> 

的跨域请求由浏览器阻止:

否“访问控制允许来源”标头出现在所请求的资源。因此'Origin'https://www.mytestpage.com'不允许访问。响应的HTTP状态码为403.

在tomcat日志文件中,我也看到了403的响应代码。有趣的是,我的应用程序的代码从未在交叉源请求的情况下执行。请求在到达我的应用程序之前被阻止,并且403被立即发送。我在tomcat前没有apache,这是纯粹的tomcat。我尝试了很多东西,包括将白名单列出来并指定允许的标题 - 没有任何帮助。我还尝试以编程方式设置标题,直到我发现从未执行跨源请求时的代码。

UPD:终点接受POST请求。这些POST请求以JS片段的XmlHttpRequests的形式发送。

任何想法它可以是什么?

p.s我可以做出成功的相同的原产地请求。

+0

嗨, 你在'CorsFilter'配置中使用默认值, 所以问题可以与一切有关。 例如 'cors.allowed.methods'默认值是'GET,POST,HEAD,OPTIONS',也许在请求'DELETE'尝试。 你能发布更多的细节吗? – snieguu

+0

我已更新该问题。我正在发送POST请求。 – bekon

+0

请求被'org.apache.catalina.filters.CorsFilter'拒绝。尝试调试它或设置你的记录器到这个类的调试级别。 – snieguu

回答

0

我发现了什么问题 - 我不得不在请求中设置Content-Type标头,否则请求会被阻止。 - Tomcat CORS filter

1

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

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

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