在Tomcat中设置CORS头

我有一个由Tomcat托pipe的静态网站。

如何为我的网站设置一个标题,如: Access-Control-Allow-Origin: *

它们都是静态文件,而不是任何servlet应用程序。

如果它是一个静态站点,那么从Tomcat 7.0.41开始,可以通过内置filter轻松控制CORS行为。

几乎你唯一需要做的就是在CATALINA_HOME/conf编辑全局web.xml ,并添加filter定义:

      <! -  ==================内置filter定义=====================  - >

       ...

      <滤波器>
        <滤波器名称> CorsFilter </filter - 名称>
        <滤波器级> org.apache.catalina.filters.CorsFilter </滤波器级>
      </filter>
      <滤波器映射>
        <滤波器名称> CorsFilter </filter - 名称>
        <URL模式> / * </ URL模式>
      </filter映射>

     <! -  ====================内置filter映射====================== - >

但请注意,Firefox不喜欢Access-Control-Allow-Origin: *和带有凭证(cookies)的请求: 当对凭证请求进行响应时,服务器必须指定一个域,并且不能使用通配。

这是一个非常基本的filter,将添加CORS标题。 请注意,默认情况下,这将启用所有域和方法,所以您应该自定义它以适应您的需求。

它也需要是你的web.xml中的第一个filter。

 package com.conductiv.api.listener; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CORSFilter implements Filter { public void destroy() { } public static String VALID_METHODS = "DELETE, HEAD, GET, OPTIONS, POST, PUT"; public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { HttpServletRequest httpReq = (HttpServletRequest) req; HttpServletResponse httpResp = (HttpServletResponse) resp; // No Origin header present means this is not a cross-domain request String origin = httpReq.getHeader("Origin"); if (origin == null) { // Return standard response if OPTIONS request w/o Origin header if ("OPTIONS".equalsIgnoreCase(httpReq.getMethod())) { httpResp.setHeader("Allow", VALID_METHODS); httpResp.setStatus(200); return; } } else { // This is a cross-domain request, add headers allowing access httpResp.setHeader("Access-Control-Allow-Origin", origin); httpResp.setHeader("Access-Control-Allow-Methods", VALID_METHODS); String headers = httpReq.getHeader("Access-Control-Request-Headers"); if (headers != null) httpResp.setHeader("Access-Control-Allow-Headers", headers); // Allow caching cross-domain permission httpResp.setHeader("Access-Control-Max-Age", "3600"); } // Pass request down the chain, except for OPTIONS if (!"OPTIONS".equalsIgnoreCase(httpReq.getMethod())) { chain.doFilter(req, resp); } } public void init(FilterConfig config) throws ServletException { } } 

您需要添加一个Filter来添加额外的标题并将其configuration到所有path

 <filter> <filter-name>header</filter-name> <filter-class>...</filter-class> </filter> <filter-mapping> <filter-name>header</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>