web-dev-qa-db-fra.com

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 pour mon site comme: Access-Control-Allow-Origin: *

Ce sont tous des fichiers statiques, pas une application de servlet.

33
Dozer

S'il s'agit d'un site statique, à partir de Tomcat 7.0.41, vous pouvez facilement contrôler le comportement de CORS via un filtre intégré .

La seule chose que vous avez à faire est de modifier le web.xml Global dans CATALINA_HOME/conf Et d'ajouter la définition de filtre:

 <! - ================== Définitions des filtres intégrés =================== == -> 
 
 ... 
 
 <filter> 
 <filter-name> CorsFilter </filter-name> 
 <filter-class> org.Apache.catalina.filters.CorsFilter </filter-class> 
 </filter> 
 <filter-mapping> 
 <filtre- nom> CorsFilter </filter-name> 
 <url-pattern>/* </url-pattern> 
 </filter-mapping> 
 
 <! - ==================== Mappages de filtres intégrés ======================= > 
 

Sachez cependant que Firefox n'aime pas Access-Control-Allow-Origin: * Et les demandes avec des informations d'identification (cookies): lors de la réponse à une demande d'identification, le serveur doit spécifier un domaine, et ne peut pas utiliser le joker.

64
Johannes Jander

Voici un filtre très basique qui ajoutera les en-têtes CORS. Notez que par défaut, cela activera tous les domaines et toutes les méthodes, vous devez donc les personnaliser en fonction de vos besoins.

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

    }

}
12
Federico Raggi

Vous devez ajouter un Filter pour ajouter l'en-tête supplémentaire et le configurer sur 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
shyam