在Tomcat 8.0中启用CORS响应筛选器

我试图使用相当基本的jQuery.ajax POST请求从另一个服务器(跨源)调用一个服务器上的Web服务。

  return $.ajax({ type: "POST", url: "http://dev.hostname.com/ws/account/example1@example.com?property_id=1&custnum=123456", dataType:"json" }); 

我总是得到以下error响应…

XMLHttpRequest无法加载http://dev.hostname.com/ws/account/example1@example.com?property_id=1&custnum=123456 。 请求的资源上不存在“Access-Control-Allow-Origin”标头。 原因http://localhost:63342因此不允许访问。

Web服务是在Apache Tomcat/8.0.8上托管的基于Java构建的基于Jersey的Web服务。 我曾尝试将请求作为JSONP发送,但在尝试处理promise对象的回调时遇到了问题。 然而,这是另一篇文章……作为替代方案,我决定研究实施CORS Response解决方案。 现在我对Java编程非常陌生,对它不太满意所以请耐心等待。

我已经研究了两种实现CORS的主要解决方案。 一种是构建自定义响应filter。 我无法让它工作但后来发现,因为Tomcat 7.0已经提供了一个filter。 我已经看到了第二个解决方案的几个post,但绝对没有运气。 使用Apache Tomcat文档中提供的指南,我将以下FILTER信息添加到应用程序的web.xml文件中(我也尝试将其添加到root的web.xml中,但它也没有在那里工作)。

  CorsFilter org.apache.catalina.filters.CorsFilter  cors.allowed.origins *   cors.allowed.methods GET,POST,HEAD,OPTIONS,PUT   cors.allowed.headers Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Last-Modified   cors.exposed.headers Access-Control-Allow-Origin,Access-Control-Allow-Credentials   cors.support.credentials true    CorsFilter /*  

因为我使用的是Tomcat 8.0.8 。 我原以为这会起作用,但我仍然会遇到同样的错误。 我错过了什么吗?

谢谢你的帮助。

更新

我在Firefox中调用服务时添加Firebug的头文件。 这是请求标头……

 Accept application/json, text/javascript, */*; q=0.01 Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Cache-Control no-cache Connection keep-alive Content-Length 0 Host dev.hostname.com Origin http://localhost:63342 Pragma no-cache Referer http://localhost:63342/keurig/default.html User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0 

这是Response标头

 Content-Length 0 Content-Type text/plain Date Thu, 21 Aug 2014 17:50:58 GMT Server Apache-Coyote/1.1 

我绝对没有看到任何期望在响应中看到的“Access-Control- *”标头。

这里提供的CORS配置对我有用,但直到我在最后一个标题中的逗号之后删除了’Allowed Headers’中的空格。

Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Last-Modified

一旦我在“Last-Modified”之前取出那个空间,我就开始了。

在运行Apache Tomcat / 8.0.43的传统Struts 2应用程序中修复此问题的解决方案是在web.xml配置文件中的Struts 2filter之前添加CORSfilter。