Définir l'en-tête CORS dans Tomcat

J'avais un site Web statique hébergé par Tomcat.

Comment définir un en-tête de mon site comme:Access-Control-Allow-Origin: *

Ce sont tous des fichiers statiques, pas n'importe quelle application servlet.

30
demandé sur Mikaveli 2013-04-30 13:08:28

3 réponses

si C'est un site statique, alors à partir de Tomcat 7.0.41, vous pouvez facilement contrôler le comportement de CORS via un filtre intégré.

a peu près la seule chose que vous avez à faire est d'éditer le global web.xmlCATALINA_HOME/conf et ajouter la définition du filtre:

     <!-- ================== 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 ====================== -->

soyez conscient, cependant, que Firefox n'aime pas Access-Control-Allow-Origin: * et les demandes avec des informations d'identification (cookies): pour répondre à une requête validée, le serveur doit spécifier un domaine, et ne peut pas utilisez le cardage sauvage.

59
répondu Johannes Jander 2015-08-19 06:08:30

voici un filtre très basique qui ajoutera les en-têtes CORS. Notez que par défaut, cela activera tous les domaines et méthodes donc vous devriez le personnaliser pour s'adapter à vos besoins.

Il doit aussi être le premier filtre de votre site 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 {

    }

}
11
répondu Federico Raggi 2013-04-30 19:14:50

vous devez ajouter un Filter pour ajouter l'en-tête supplémentaire et le configurer à tous les chemins

<filter>
  <filter-name>header</filter-name>
  <filter-class>...</filter-class>
</filter>
<filter-mapping>
  <filter-name>header</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
3
répondu shyam 2013-04-30 09:14:31