2012-05-26 14 views
8

Configuro mi servidor Jetty para permitir solicitudes HTTP entre dominios (allowedOrigins = *) y también para permitir la autenticación entre dominios (allowCredentials = true) usando su CrossOriginFilter. Las solicitudes HTTP de dominio cruzado sin requisito de autenticación funcionan bien. Ahora, cuando se trata de llamadas http que requieren autenticación, no funciona usando JQuery. Utilizo el siguiente código y seguido este ejemplo: http://www.aswinanand.com/2009/01/http-basic-authentication-using-ajax/jquery autenticación de dominio cruzado

function login(username, password) { 
$.ajax({ 
    type: "GET", 
    contentType: "application/json", 
    dataType: "json", 
    url: url, 
    beforeSend: function(xhr) { 
     var base64 = Base64.encode(username + ":" + password); 
     xhr.setRequestHeader("Authorization", "Basic " + base64); 
     xhr.withCredentials = true; 
    }, 
    error: function(data){ 
     alert("error"); 
    }, 
    success: function(data){ 
     alert("success"); 
    } 
}); 

En HttpFox i ver la siguiente petición al servidor:

OPTIONS /login HTTP/1.1 
... 
Access-Control-Request-Method GET 
Access-Control-Request-Headers authorization,content-type 

El servidor responde con un

HTTP/1.1 204 No Content 
... 
Allow OPTIONS,GET,HEAD 

I también usó las opciones a continuación, lo que no hace la diferencia.

$.ajax({ 
    ... 
    username: username, 
    password: password, 
    ... 
} 

La función de error siempre se dispara. ¿Alguien una idea de lo que podría ser el problema?

+0

ves esto en su cabecera de respuesta 'Access-Control -Allow-Origen: * '? ¡Gran pregunta por cierto! Bienvenido a StackOverflow! – jmort253

+0

Creo que sería útil si pudieras mostrar cualquier acumulación de pila relacionada con el problema. – jmort253

+0

bien, compruebe si ese encabezado está incluido en su respuesta.Si no es así, entonces es posible que la seguridad anule los encabezados de respuesta. Necesita ver más registros para depurar aún más. ¡Buena suerte! :) – jmort253

Respuesta

5

A medida que el parámetro predeterminado cabeceras son

X-solicitada-Con, Content-Type, acepte, Origen

he tenido que añadir las cabeceras

de autorización, el tipo de contenido

encontré por el archivo de registro

DEBUG [2012-05-27 17:04 : 02,468] org.eclipse.jetty.servlets.CrossOriginFilter: Headers [autorización, tipo de contenido] no se encuentran entre los encabezados [X-Requerido-Con, Content-Type, Aceptar, Origen]

¡Gracias por todos los consejos!

3

Los encabezados de respuesta que configura en su aplicación: cuando la seguridad no está habilitada 00 funciona bien, como ha comprobado. Sin embargo, cuando la seguridad está habilitada, sus solicitudes entre dominios fallan.

Esto probablemente se deba al filtro adicional y a los encabezados de respuesta adicionales establecidos por el filtro de seguridad para generar una respuesta.

Para resolver este problema, la solución de alto nivel es que debe establecer sus encabezados de respuesta antes del momento en que el filtro de seguridad establece sus encabezados de respuesta y/o los confirma al cliente.

Usted también está utilizando Jetty; Por lo tanto, se puede utilizar el Jetty Cross Origin Filter para asegurar que las cabeceras de respuesta se define en la cadena de filtro, en el orden en que se deben establecer:

Aquí es una lista de parámetros que puede pasar a la configuración del filtro en la web .xml:

  • allowedOrigins, una coma lista de orígenes que tienen permiso para acceder a los recursos separados. El valor predeterminado es *, lo que significa todos los orígenes

  • permitMethods, una lista separada por comas de los métodos HTTP que se permiten para acceder a los recursos. El valor predeterminado es GET, POST

  • allowedHeaders, una lista separada por comas de encabezados HTTP que pueden especificarse al acceder a los recursos. El valor predeterminado es X-Requerido-Con

  • preflightMaxAge, el número de segundos que el cliente puede almacenar en caché las solicitudes de verificación previa. El valor predeterminado es 1800 segundos, o 30 minutos

  • allowCredentials, un valor booleano que indica si el recurso permite solicitudes con credenciales.El valor por defecto es falso

Por defecto, la cabecera de respuesta Orígenes mascotas se establece en *, lo que implica que, por defecto, cualquier solicitud puede hacerse de cualquier dominio. Tendrá que estar seguro de modificar esto para permitir que sólo los dominios que tiene la intención a la lista blanca, asumiendo que no quiere todas las solicitudes de todos los dominios sea válida:

entrada

web.xml para el filtro:

<web-app ...> 
    ... 
    <filter> 
     <filter-name>cross-origin</filter-name> 
     <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>cross-origin</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    ... 
</web-app> 

Aquí es una lista de recursos adicionales que le puede ser útil en la solución de este problema en particular:

0

Para la materia SOAP, los encabezados se admiten también debe incluir MessageType, SOAPAction

Mira que no se permite el comodín para configurar los encabezados permitidos ...

Cuestiones relacionadas