7

这个问题:支持CORS的服务器?是关于常规 servlet;而且我确实知道如何设置标题来控制 CORS。

我的问题是如何配置 Tomcat 在 CORS 限制下提供静态内容。

4

3 回答 3

15

从 Tomcat 7.0.41 开始,您可以通过内置过滤器轻松控制 CORS 行为。

参考:

几乎您唯一需要做的就是编辑全局web.xml输入CATALINA_HOME/conf并添加过滤器定义:

     <!-- ================== 内置过滤器定义 ====================-->

      ...

     <过滤器>
       <filter-name>CorsFilter</filter-name>
       <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
     </过滤器>
     <过滤器映射>
       <filter-name>CorsFilter</filter-name>
       <url-pattern>/*</url-pattern>
     </filter-mapping>

    <!-- ==================== 内置过滤器映射 ====================== -->

但请注意,Firefox 不喜欢Access-Control-Allow-Origin: *使用凭据 (cookie) 进行请求:在响应凭据请求时,服务器必须指定域,并且不能使用通配符。

如果您想在这种情况下调试请求,请注意,根据此流程图,只有在存在跨域请求时才会发送 CORS 标头:CORS流程图

(tomcat.apache.org/tomcat-8.0-doc/images/cors-flowchart.png)

于 2013-09-13T14:49:38.500 回答
1

这是一个用于添加 CORS 支持的 Tomcat 过滤器:https ://bitbucket.org/jsumners/corsfilter

于 2012-08-21T18:25:25.460 回答
1

嗨弗拉德!这是一个很晚的回应,现在你一定已经弄清楚了。如果其他人遇到同样的问题,这就是答案。

显然,您了解 CORS 过滤器,并且 Tomcat 过滤器将仅应用于 servlet。

为了使所有静态内容都通过一些servlet,Tomcat 有一个特殊的DefaultServet - 这就是您要寻找的。

基本上,我们只需要在部署描述符文件(如 WEB-INF/web.xml)中启用它,例如:

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>


<servlet>
  <servlet-name>default</servlet-name>
  <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

这样 Tomcat 过滤器,在我们的例子中,CORS 过滤器将为静态内容启用。

为了测试,为了让 CORS 过滤器实际设置标头,例如Access-Control-Allow-Origin,我们需要在请求中添加一些其他标头,例如Origin。例如:

curl -H 'Origin: http://localhost/test' -i http://myserver/crossOrigin.resource

这样你会看到类似的东西:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: http://localhost/test
Access-Control-Allow-Credentials: true
Accept-Ranges: bytes
...
于 2014-08-15T00:19:57.037 回答