【问题标题】:How do I tell tomcat to support CORS for static content? [duplicate]如何告诉 tomcat 支持静态内容的 CORS? [复制]
【发布时间】:2012-08-16 09:56:07
【问题描述】:

这个问题:Servers that supports CORS? 是关于常规 servlet;而且我确实知道如何设置标题来控制 CORS。

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

【问题讨论】:

    标签: tomcat static cors


    【解决方案1】:

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

    【解决方案2】:

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

    参考资料:

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

    ... CorsFilterorg.apache.catalina.filters.CorsFilter过滤器> CorsFilter/*

    但请注意,Firefox 不喜欢 Access-Control-Allow-Origin: * 和带有凭据 (cookie) 的请求:when responding to a credentialed request, server must specify a domain, and cannot use wild carding.

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

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

    【讨论】:

      【解决方案3】:

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

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

      为了让所有静态内容通过一些 servlet,Tomcat 有一个特殊的DefaultServet - 这就是你要找的。​​p>

      基本上,我们只需要在部署描述符文件(如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
      ...
      

      【讨论】:

      • 这在我的 Tomcat 8.5 设置中不是必需的。我只需要应用@johannes-jander 的解决方案。我陷入了一个陷阱,即 CORS 过滤器在何时发送标头和何时不发送标头时非常智能(请参阅tomcat.apache.org/tomcat-8.0-doc/images/cors-flowchart.png)。只是从浏览器执行 GET 根本不会显示标头,因为它不是跨域请求。
      猜你喜欢
      • 2011-02-01
      • 2011-02-26
      • 2011-04-18
      • 2018-12-25
      • 2012-05-17
      • 2022-12-10
      • 2014-05-27
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多