2011-11-28 18 views
25

Ho configurato il filtro di origine incrociato di Jetty, ma continuo a ricevere il seguente errore. Qualcuno sa cosa c'è di sbagliato e come risolverlo? Di seguito il messaggio di errore è il mio descrittore di sostituzione (cioè web.xml supplementare)Jetty Cross Origin Filter

Errore:

Origin http://localhost:8090 is not allowed by Access-Control-Allow-Origin. 

Override descrittore:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
<filter> 
    <filter-name>cross-origin</filter-name> 
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> 
    <init-param> 
     <param-name>allowedOrigins</param-name> 
     <param-value>*</param-value> 
    </init-param> 
    <init-param> 
     <param-name>allowedMethods</param-name> 
     <param-value>*</param-value> 
    </init-param> 
    <init-param> 
     <param-name>allowedHeaders</param-name> 
     <param-value>*</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>cross-origin</filter-name> 
    <filter-pattern>/*</filter-pattern> 
</filter-mapping> 
</web-app> 

Request Header

Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Access-Control-Request-Headers:Origin, Content-Type, Accept 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:localhost:8080 
Origin:http://localhost:8090 
Referer:http://localhost:8090/home 
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.942.0 

intestazione di risposta

Allow:POST,GET,OPTIONS,HEAD 
Content-Length:0 
Date:Wed, 30 Nov 2011 02:13:21 GMT 
Server:Jetty(7.5.4.v20111024) 
+0

si può utilizzare uno strumento come Wireshark per mostrare l'attuale intestazioni di richiesta/risposta vengono scambiati? Ciò contribuirà a verificare se vengono inviate le intestazioni CORS corrette. – monsur

+0

@monsur: ho aggiunto i dettagli dell'intestazione richiesta/risposta. L'intestazione della risposta NON include 'access-control-allow-origin: *' – Ari

+0

Hmm, non sono sicuro. Puoi controllare i log per vedere se il filtro sta registrando qualcosa? Il filtro ha una configurazione del registratore: http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/servlets/CrossOriginFilter.html#77 – monsur

risposta

22

Aloha,

Ho combattuto questa per un po 'così, e ha scoperto che il nodo finale deve essere:

<filter-mapping> 
    <filter-name>cross-origin</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
NON

<filter-mapping> 
    <filter-name>cross-origin</filter-name> 
    <filter-pattern>/*</filter-pattern> 
</filter-mapping> 

H Ecco il link che ho trovato per aiutarmi: wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter

Dopo aver aggiornato il file web.xml e riavviato il server jetty, sono riuscito a effettuare una richiesta di dominio incrociato utilizzando le chiamate jQuery ajax.

Rob

+0

"pattern di filtro" non è riconosciuto dal mio schema, nessuna idea di dove sia definito? Non è in: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" \t xmlns = "http://java.sun.com/xml/ns/javaee" \t xsi: schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" \t version = "3.0" – perilandmishap

+1

In Jetty 9 'allowedHeaders' e' allowedMethods', '*' non funzioneranno. –

11

mi sono imbattuto in questo quando si fa le chiamate crossdomain alle applicazioni Web distribuite a GAE. È possibile aggiungere un header esplicito ai vostri Servlet (i) le risposte, come:

public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException 
{ 
    res.addHeader("Access-Control-Allow-Origin", "*"); 
    ... 
} 

e anche fare in modo di avere un file di criteri crossdomain.xml nella root della vostra guerra, come:

<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"> 
<allow-access-from domain="*"/> 
</cross-domain-policy> 

HTH.

4

Per me (molo versione 8.1.5.v20120716) solo queste righe in 'web.xml' aiuta:

<filter> 
    <filter-name>cross-origin</filter-name> 
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> 
    <init-param> 
     <param-name>allowedOrigins</param-name> 
     <param-value>*</param-value> 
    </init-param> 
    <init-param> 
     <param-name>allowedMethods</param-name> 
     <param-value>GET,POST,DELETE,PUT,HEAD</param-value> 
    </init-param> 
    <init-param> 
     <param-name>allowedHeaders</param-name> 
     <param-value>origin, content-type, accept</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>cross-origin</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Sono livello di log modifica DEBUG e ottenere informazioni (come 'GET, POST, DELETE, PUT, HEAD' e 'origine, content-type, accept') dal log della console di jetty. Per esempio.:

DEBUG CrossOriginFilter: 359 - metodo Delete è tra metodi permessi [GET, POST, DELETE, PUT, HEAD] 19: 14: 28.413

DEBUG CrossOriginFilter: 389 - Basette [origine, tipo di contenuto, accetta] non sono tra le intestazioni ammessi [*]

Poi ho controllato risultato con $ .ajax ({url: 'anotherHost', tipo: 'Elimina', ..})

4

ho avuto lo stesso problema con ActiveMQ Ajax in Jetty Web Server. Il mio problema era che il campo intestazioni consentite non accetta un carattere jolly in forma di "*".

Per far funzionare ActiveMQ Ajax, devo anche aggiungere il metodo "Opzioni" ai parametri consentiti.

filtro Cross-Origin da web.xml:

<filter> 
    <filter-name>cross-origin</filter-name> 
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> 
    <init-param> 
     <param-name>allowedOrigins</param-name> 
     <param-value>*</param-value> 
    </init-param> 
    <init-param> 
     <param-name>allowedMethods</param-name> 
     <param-value>GET,POST,OPTIONS,DELETE,PUT,HEAD</param-value> 
    </init-param> 
    <init-param> 
     <param-name>allowedHeaders</param-name> 
     <param-value>origin, content-type, accept, authorization</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>cross-origin</filter-name> 
    <url-pattern>*</url-pattern> 
</filter-mapping> 
Problemi correlati