Подтвердить что ты не робот

Установить заголовок CORS в Tomcat

У меня был статический веб-сайт, размещенный Tomcat.

Как настроить заголовок для моего сайта, например: Access-Control-Allow-Origin: *

Все они являются статическим файлом, а не сервлет-приложением.

4b9b3361

Ответ 1

Если это статический сайт, то, начиная с Tomcat 7.0.41, вы можете легко контролировать поведение CORS через встроенный фильтр.

Ссылки:

Практически единственное, что вам нужно сделать, это отредактировать глобальный web.xml в CATALINA_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: * и запрашивает учетные данные (куки): при ответе на запрос с учетными данными сервер должен указать домен и не может использовать подстановочные знаки.

Если вы хотите отлаживать запросы в этой ситуации, имейте в виду, что заголовки CORS отправляются только в том случае, если в соответствии с этой блок-схемой существует запрос кросс-источника. CORS flow chart

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

Ответ 2

Вот очень простой фильтр, который добавит заголовки 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 {

    }

}

Ответ 3

Вам нужно добавить Filter, чтобы добавить дополнительный заголовок и настроить его на все пути

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