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

时间:2014-08-22 07:52:12

标签: java jquery ajax tomcat 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。   No' Access-Control-Allow-Origin'标题出现在请求的上   资源。因此不允许来源http://localhost:63342   访问。

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

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

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

<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

因为我正在使用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

这是响应标题

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

我绝对没有看到任何&#34;访问控制 - *&#34;期望在响应中看到的标题。

2 个答案:

答案 0 :(得分:4)

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

  

<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Last-Modified</param-value>

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

答案 1 :(得分:0)

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