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