在Tomcat中设置CORS头

Doz*_*zer 34 tomcat header cors

我有一个由Tomcat托管的静态网站.

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

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

Joh*_*der 66

如果它是静态站点,那么从Tomcat 7.0.41开始,您可以通过内置过滤器轻松控制CORS行为.

几乎你所要做的就是编辑的全球唯一web.xmlCATALINA_HOME/conf,并添加过滤器定义:

     <!-- ================== Built In Filter Definitions ===================== -->

      ...

     <filter>
       <filter-name>CorsFilter</filter-name>
       <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
     </filter>
     <filter-mapping>
       <filter-name>CorsFilter</filter-name>
       <url-pattern>/*</url-pattern>
     </filter-mapping>

    <!-- ==================== Built In Filter Mappings ====================== -->

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

  • 当调试时,请注意只有在存在跨源请求时才会发送CORS头.请参阅https://tomcat.apache.org/tomcat-8.0-doc/images/cors-flowchart.png.所以请不要只检查随机调用(使用Fiddler,网络选项卡,......),但实际上CORS会自行请求. (5认同)
  • 添加该过滤器后,我仍然得到*对预检请求的响应未通过访问控制检查:所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问源“ http:// localhost:8080”。响应的HTTP状态码为403 *。而且我的方法实际上是GET,已经转换为OPTION并返回403 (2认同)
  • 如果您想测试某些内容,可以通过此[nice网站](http://test-cors.org)发送CORS请求。 (2认同)

小智 13

这是一个非常基本的过滤器,它将添加CORS头.请注意,默认情况下,这将启用所有域和方法,因此您应该自定义它以满足您的需要.

它还需要是web.xml中的第一个过滤器.

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 {

    }

}
Run Code Online (Sandbox Code Playgroud)


mim*_*imo 10

请注意,要使用 value 配置 CORS 过滤器*,除了启用文件管理器之外,您还需要添加<param-value>*</param-value>参数配置,如下所示(构建在 Johannes Jander答案<param-name>cors.allowed.origins</param-name>之上):

 <!-- ================== Built In Filter Definitions ===================== -->

  ...

 <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>
 </filter>
 <filter-mapping>
   <filter-name>CorsFilter</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>

<!-- ==================== Built In Filter Mappings ====================== -->
Run Code Online (Sandbox Code Playgroud)