在Tomcat 8.0中启用CORS响应过滤器

4

我正在尝试使用基本的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"
        });

我总是收到以下错误响应...

XMLHttpRequest无法加载http://dev.hostname.com/ws/account/example1@example.com?property_id=1&custnum=123456。请求的资源上没有'Access-Control-Allow-Origin'标头。因此,源http://localhost:63342被拒绝访问。

这个Web服务是基于Java构建的Jersey Web服务,托管在Apache Tomcat/8.0.8上。我已经尝试将请求发送为JSONP,但在处理来自Promise对象的回调时遇到了问题。那是另一个帖子...作为替代方案,我决定研究实现CORS响应解决方案。现在,我对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

我确实没有看到任何“Access-Control-*”头,这些头通常会在响应中出现。


首先尝试最小化设置,不添加任何init-params,使一切保持默认状态。看看是否有效,然后逐步添加其他配置属性,直到它停止工作。我已经在Tomcat 7上使用最小设置使其正常运行。 - Gimby
谢谢您的回复,Gimby...不幸的是没有改变。我是否忽略了其他什么?我是否需要在其他地方配置或安装某些内容以便它关注配置文件?我之所以这样问是因为我尝试了我能想到的每种配置组合,但总是得到完全相同的响应。我本来期望错误行为会有一些变化;一个新的错误或者其他什么。实际上,我曾经检查过一次,确保我正在调整正确的服务器! - Gary O. Stenstrom
1
将Chrome浏览器的网络信息添加到原始帖子中。 - Gary O. Stenstrom
我被卡住了。我唯一稍微不同的事情就是将过滤器映射到/REST/*,因为这是我映射到JAX-RS服务的模式。那个请求的方法是什么?它是一个OPTIONS请求吗? - Gimby
@GaryO.Stenstrom,你是怎么解决这个问题的? - pHM
显示剩余6条评论
2个回答

4
这里提供的CORS配置对我有用,但只有在我删除了最后一个标头逗号后的“允许标头”中的空格后才起作用。

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

一旦我去掉了“最后修改时间”之前的空格,就可以正常工作了。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接