2012-05-26 13 views
8

Ich konfiguriere meinen Jetty-Server, um domainübergreifende http-Anfragen (allowedOrigins = *) zuzulassen und auch Cross-Domain-Authentifizierung (allowCredentials = true) mit seinem CrossOriginFilter zu erlauben. Cross-Domain-HTTP-Anfragen ohne Authentifizierung Anforderung funktionieren ok. Wenn es um HTTP-Aufrufe geht, die eine Authentifizierung erfordern, funktioniert das mit JQuery nicht. Ich verwende den folgenden Code und folgten diesem Beispiel: http://www.aswinanand.com/2009/01/http-basic-authentication-using-ajax/jquery cross domain authentication

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 ich sehe die folgende Anfrage an den Server:

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

Der Server wird mit einem I

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

reagiert auch nutzte die folgenden Optionen, was keinen Unterschied macht.

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

Die Fehlerfunktion wird immer ausgelöst. Jemand eine Idee, was das Problem sein könnte?

+0

Sie diesen Header in Ihrer Antwort finden Sie unter 'Access-Control -Allow-Origin: * '? Große Frage übrigens! Willkommen bei StackOverflow! – jmort253

+0

Ich denke, es wäre hilfreich, wenn Sie irgendwelche Stacktraces für das Problem anzeigen könnten. – jmort253

+0

ok, überprüfen Sie bitte, ob dieser Header in Ihrer Antwort enthalten ist.Wenn nicht, ist es möglich, dass die Sicherheit die Antwortheader überschreibt. Sie müssen mehr Protokolle sehen, um weiter zu debuggen. Viel Glück! :) – jmort253

Antwort

5

als Standard erlaubt Header sind

X-Requested-With, Content-Type, Accept, Herkunft

Ich musste die Header hinzufügen

Genehmigung, content-type

diese Datei über das Protokoll gefunden

DEBUG [2012-05-27 17.04 : 02,468] org.eclipse.jetty.servlets.CrossOriginFilter: Header [Autorisierung, Inhaltstyp] gehören nicht zu den zulässigen Headern [X-Requested-With, Inhaltstyp, Accept, Origin]

Danke für alle Hinweise!

3

Die Antwortheader, die Sie in Ihrer Anwendung festgelegt haben - wenn die Sicherheit nicht aktiviert ist, funktioniert 00 einwandfrei, wie Sie bestätigt haben. Wenn die Sicherheit aktiviert ist, schlagen Ihre domänenübergreifenden Anforderungen jedoch fehl.

Dies liegt wahrscheinlich an den zusätzlichen Filter- und zusätzlichen Antwortheadern, die vom Sicherheitsfilter festgelegt werden, um eine Antwort zu generieren.

Um dieses Problem zu lösen, ist die High-Level-Lösung, dass Sie Ihre Antwort Header vor dem Zeitpunkt, dass der Sicherheitsfilter seine Antwortheader setzt und/oder sie an den Client festlegt.

Sie verwenden auch Jetty; Daher können Sie die Jetty Cross Origin Filter verwenden, um sicherzustellen, dass die Antwortheader in der Reihenfolge der zu setzenden Filterkette gesetzt sind:

Hier ist eine Liste der Parameter, die Sie in die Filterkonfiguration im Web übertragen können .xml:

  • allowedOrigins, getrennt ein Komma Liste der Herkunft, die die Ressourcen zugreifen darf. Standardwert ist *, dh alle Ursprünge

  • allowedMethods, eine durch Kommas getrennte Liste von HTTP-Methoden, die beim Zugriff auf die Ressourcen verwendet werden dürfen. Standardwert ist GET, POST

  • allowedHeaders, eine durch Kommas getrennte Liste von HTTP-Headern, die beim Zugriff auf die Ressourcen angegeben werden dürfen. Der Standardwert ist X-Requested-With

  • PreflightMaxAge, die Anzahl der Sekunden, die Preflight-Anforderungen vom Client zwischengespeichert werden können. Standardwert ist 1800 Sekunden oder 30 Minuten

  • allowCredentials, ein boolescher Wert, der angibt, ob die Ressource Anforderungen mit Anmeldeinformationen zulässt.Standardwert ist false

standardmäßig der erlaubt Origins-Response-Header wird auf *, die das standardmäßig schon sagt, kann jede Anforderung aus einem beliebigen Domäne hergestellt werden. Sie werden müssen, dass dies zu ändern, nur Domänen zu ermöglichen, die Sie beabsichtigen, die weiße Liste, die Sie nicht jede Anfrage aus allen Bereichen wollen unter der Annahme gültig sein:

web.xml Eintrag für die Filter:

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

ist eine Liste der zusätzlichen Ressourcen, die Sie bei der Lösung dieses spezielle Problem hilfreich sein können:

0

Für SOAP Sachen sollten die erlaubt Header enthalten auch Message, Soapaction

Beachten Sie, dass kein Wildcard darf die zulässigen Header konfigurieren ...