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.
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.xml
CATALINA_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.
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 {
}
}
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>