2014-06-24 11 views
13

voglio consentire Tomcat filtro CORS, ho aggiunto questo a web.xml:Tomcat CORS filtro

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

Ma non funziona. Ho provato con un filtro personalizzato:

<filter> 
    <filter-name>SimpleCORSFilter</filter-name> 
    <filter-class>com.common.SimpleCORSFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SimpleCORSFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

con questa classe:

public class SimpleCORSFilter implements Filter { 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse response = (HttpServletResponse) res; 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); 
     chain.doFilter(req, res); 
    } 
} 

E questo funziona bene, mi puoi dire perché? Non so se è importante, ma io sono usign Spring Framework.

+0

Come hai testato il 'CorsFilter'? Con richiesta AJAX o con un semplice GET? – cy3er

+0

Entrambi, ma firebug non mostra l'intestazione Access-Control – Tobia

+0

Puoi fornire un esempio completo di come configurare SimpleCORSFilter? Quali sono le importazioni? Dove vive la classe? Vorrei aggiungere la lezione a Tomcat e non so come. –

risposta

30

Il filtro org.apache.catalina.filters.CorsFilter cerca prima un'intestazione nella richiesta: Origin. Se questa intestazione non esiste, il filtro non aggiunge alcuna intestazione nella risposta. Forse per questo motivo non funziona.

Inoltre, in una richiesta POST, cercare l'intestazione Content-Type. Qualcosa di simile succede ad altri metodi. Potresti vedere lo code di questo filtro. In un altro modo, c'è un flowchart:

CORS Flow Chart

+1

Diagramma di flusso molto bello, grazie – Tobia

+2

non aiuta per me. Ho aggiunto Origin http://www.stackoverflow.com solo per il test e Tomcat non restituisce le intestazioni – Dejell

+0

@Tobia il diagramma di flusso è fornito da Tomcat docs – Pere

8

ottengo un problema simile e ho trovato qualcosa che ha funzionato per me su doc ​​Tomcat tomcat-doc-CORSFilter Io uso del filtro e init-param come di seguito:

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
    <init-param> 
    <param-name>cors.allowed.origins</param-name> 
    <param-value>*</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.allowed.methods</param-name> 
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.allowed.headers</param-name> 
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.exposed.headers</param-name> 
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.support.credentials</param-name> 
    <param-value>true</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.preflight.maxage</param-name> 
    <param-value>10</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CorsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Spero che aiuti!

0

Nel mio caso con Ueditor, il X-Requested-With deve essere X_Requested_With.

Problemi correlati