2012-05-26 14 views
8

Configuro il mio server Jetty per consentire le richieste http del dominio multiplo (allowedOrigins = *) e anche per consentire l'autenticazione cross-domain (allowCredentials = true) utilizzando il suo CrossOriginFilter. Le richieste http del dominio incrociato senza requisiti di autenticazione funzionano correttamente. Ora, quando si tratta di chiamate http che richiedono l'autenticazione, non funziona con JQuery. Io uso il seguente codice e seguito questo esempio: http://www.aswinanand.com/2009/01/http-basic-authentication-using-ajax/jquery autenticazione cross domain

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"); 
    } 
}); 

In HttpFox vedo la seguente richiesta al server:

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

Il server risponde con un

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

anche io usato le opzioni qui sotto, che non fa la differenza.

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

La funzione di errore si attiva sempre. Qualcuno ha un'idea di quale potrebbe essere il problema?

+0

vedete questo nella vostra intestazione di risposta 'Ingressi Controllo -ALLOW-Origin: * '? Grande domanda a proposito! Benvenuto in StackOverflow! – jmort253

+0

Penso che sarebbe utile se potessi mostrare anche qualsiasi stacktrace relativo al problema. – jmort253

+0

ok, controlla se l'intestazione è inclusa nella risposta.In caso contrario, è possibile che la sicurezza stia annullando le intestazioni di risposta. È necessario vedere più registri per eseguire il debug ulteriormente. In bocca al lupo! :) – jmort253

risposta

5

Come impostazione predefinita ammessi intestazioni sono

X-richiesta-Con, Content-Type, Accetta, Origin

ho dovuto aggiungere intestazioni

autorizzazione, tipo di contenuto

Abbiamo trovato questo tramite il file di log

DEBUG [2012-05-27 17:04 : 02.468] org.eclipse.jetty.servlets.CrossOriginFilter: le intestazioni [autorizzazione, tipo di contenuto] non sono tra le intestazioni consentite [X-Requested-With, Content-Type, Accept, Origin]

Grazie per tutti i suggerimenti!

3

Le intestazioni di risposta impostate nell'applicazione - quando la sicurezza non è abilitata 00 funziona correttamente, come attestato. Tuttavia, quando la sicurezza è abilitata, le richieste interdominio falliscono.

Ciò è probabilmente dovuto al filtro aggiuntivo e alle intestazioni di risposta aggiuntive impostate dal filtro di sicurezza per generare una risposta.

Per risolvere questo problema, la soluzione di alto livello è che è necessario impostare tuoi intestazioni di risposta prima del momento che il filtro di sicurezza definisce i suoi header di risposta e/o li impegna al cliente.

Stai anche utilizzando Jetty; pertanto, è possibile utilizzare Jetty Cross Origin Filter per assicurarsi che le intestazioni di risposta siano impostate nella catena Filtro nell'ordine in cui devono essere impostate:

Ecco un elenco di parametri che è possibile passare alla configurazione del filtro nel Web .xml:

  • allowedOrigins, una virgola elenco di origine a cui è consentito di accedere alle risorse separato. Il valore predefinito è *, ovvero tutte le origini

  • allowedMethods, un elenco separato da virgole di metodi HTTP che possono essere utilizzati durante l'accesso alle risorse. Il valore predefinito è GET, POST

  • allowedHeaders, un elenco separato da virgole di intestazioni HTTP che possono essere specificate quando si accede alle risorse. Il valore predefinito è X-Requested-With

  • preflightMaxAge, il numero di secondi che le richieste di verifica preliminare possono essere memorizzate nella cache dal client. Il valore predefinito è 1800 secondi o 30 minuti

  • allowCredentials, un valore booleano che indica se la risorsa consente richieste con credenziali.Il valore predefinito è falso

Per impostazione predefinita, l'intestazione di risposta Origini ammessi è impostato su *, il che implica che per impostazione predefinita, ogni richiesta può essere fatta da qualsiasi dominio. Avrai bisogno di essere sicuri di modificare questo per consentire solo i domini che si intende whitelist, supponendo che non si vuole ogni richiesta da tutti i domini di essere valida:

ingresso

web.xml per il 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> 

Ecco un elenco di risorse aggiuntive che si possono trovare utili a risolvere questo particolare problema:

0

Per le cose SOAP, le intestazioni consentiti dovrebbe includere anche MessageType, SOAPAction

Attenzione che nessun jolly è consentito per configurare le intestazioni consentiti ...

Problemi correlati