2011-11-28 14 views
25

He configurado el filtro de origen cruzado de Jetty, pero continúo recibiendo el siguiente error. ¿Alguien sabe qué está mal y cómo solucionarlo? A continuación el mensaje de error es mi descriptor de anulación (es decir Web.xml suplementario)Jetty Cross Origin Filter

error:

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

Anulación de descriptores:

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

encabezado de solicitud

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 

encabezado de respuesta

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

¿Se puede utilizar una herramienta como Wireshark para mostrar los encabezados reales de petición/respuesta:

filtro de origen cruzado de web.xml? Eso ayudará a verificar si se están enviando los encabezados CORS correctos. – monsur

+0

@monsur: He agregado los detalles del encabezado de solicitud/respuesta. El encabezado de respuesta NO incluye 'access-control-allow-origin: *' – Ari

+0

Hmm, no estoy seguro. ¿Puedes verificar los registros para ver si el filtro está registrando algo? El filtro tiene una configuración de registrador: http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/servlets/CrossOriginFilter.html#77 – monsur

Respuesta

22

Aloha,

Luché esto por un tiempo así, y se encontró que el nodo final debe ser:

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

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

H Aquí está el enlace que encontré para ayudarme: wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter

Después de actualizar mi archivo web.xml y reiniciar el servidor embarcadero, pude realizar solicitudes de dominio cruzado utilizando llamadas jQuery ajax.

Rob

+0

"patrón de filtro" no es reconocido por mi esquema, ¿alguna idea de dónde se define? No está en: 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

En embarcadero 9 'allowedHeaders' y' allowedMethods', '*' no funcionarán. –

11

me encontré con esto al hacer llamadas crossdomain a aplicaciones Web desplegadas a GAE. Se puede añadir una cabecera explícita a su (s) respuestas de servlet, como:

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

y también asegurarse de que tiene un archivo de políticas crossdomain.xml en la raíz de la guerra, como:

<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

Para mí (muelle de una versión 8.1.5.v20120716) sólo estas líneas en '' web.xml ayuda:

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

He nivel de registro de cambios para depurar y conseguir información (como 'GET, POST, DELETE, PUT, HEAD' y 'origin, content-type, accept') desde el registro de la consola de embarcadero. P.ej.:

DEBUG CrossOriginFilter: 359 - Método de eliminación es entre métodos permitidos [GET, POST, DELETE, PUT, HEAD] 19: 14: 28 413

DEBUG CrossOriginFilter: 389 - Plataformas de [origen, tipo de contenido, aceptar] no están permitidos entre los encabezados [*]

Luego he comprobado resultado con $ .ajax ({url: 'anotherHost', tipo: 'Borrar', ..})

4

yo tenía el mismo problema con ActiveMQ Ajax en Jetty Web Server. Mi problema fue que el campo de encabezados permitidos no acepta un comodín en forma de "*".

Para que ActiveMQ Ajax funcione, también tengo que agregar el Método de "Opciones" a los Métodos permitidos. se intercambian

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