2013-04-30 27 views
25

Avevo un sito Web statico ospitato da Tomcat.Imposta intestazione CORS in Tomcat

come impostare un colpo di testa per il mio sito come: Access-Control-Allow-Origin: *

Sono tutti file statico, non tutte le applicazioni servlet.

risposta

49

Se si tratta di un sito statico, poi a partire con Tomcat 7.0.41, si può facilmente controllare il comportamento CORS tramite un built-in filter.

praticamente l'unica cosa che dovete fare è modificare il globale web.xml in CATALINA_HOME/conf e aggiungere la definizione del filtro:

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

essere consapevoli, però, che Firefox non piace Access-Control-Allow-Origin: * e le richieste con le credenziali (biscotti): when responding to a credentialed request, server must specify a domain, and cannot use wild carding.

+4

Quando si esegue il debug di questo, si tenga presente che le intestazioni CORS vengono inviate solo se esiste una richiesta di origine incrociata. Vedi https://tomcat.apache.org/tomcat-8.0-doc/images/cors-flowchart.png. Quindi, per favore, non basta ispezionare le chiamate a caso (usando Fiddler, scheda di rete, ...), ma in realtà le richieste CORS si richiedono. – koppor

+0

Dopo aver aggiunto quel filtro sto ancora ricevendo * La risposta alla richiesta di preflight non passa il controllo del controllo accessi: Nessuna intestazione 'Access-Control-Allow-Origin-' è presente sulla risorsa richiesta. L'origine 'http: // localhost: 8080' non è quindi consentita l'accesso. La risposta aveva codice di stato HTTP 403 *. Anche il mio metodo che è in realtà un GET è stato convertito in OPTION e restituisce 403 – Jerry

3

è necessario aggiungere un Filter per aggiungere l'intestazione aggiuntivo e configurarlo per tutti i percorsi

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

era solo un sito Web statico, devo usare servlet? – Dozer

+0

Sì, non è possibile aggiungere un'intestazione senza un '' Servlet' o 'Filtro' in Tomcat – shyam

+2

@Dozer: considerare l'utilizzo di [filtri forniti dal contenitore] (http://tomcat.apache.org/tomcat-7.0-doc/config/filter .html) per i casi d'uso più comuni. –

10

Qui è un filtro molto di base che aggiungerà le intestazioni CORS. Tieni presente che, per impostazione predefinita, questo abiliterà tutti i domini e i metodi, quindi dovresti personalizzarlo in base alle tue esigenze.

Deve anche essere il primo filtro nel 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 { 

    } 

} 
+0

come utilizzare questa classe ?. Devo aggiungere il mio metodo @Post in questa classe "CORSFilter" – iambasiljoy

+0

Crea questo corso nella tua app. Quindi aggiungere questo percorso di classe in web.xml della tua app in cui classe intestazione .......... header /* iambasiljoy

+0

soluzione perfetta. – iambasiljoy

Problemi correlati