AngularJS $http POST withCredentials schlägt mit Daten im request-body
AngularJS authentifiziert der server-Seite, die Verwendung von REST und bekommt das JSESSIONID-cookie.
Im nächsten Schritt versuche ich, einige zu bekommen, JSON-Daten vom server-Seite, die Verwendung von REST zusammen mit dem session-cookie, gesammelt in der vorherigen Schritt. Hier ist der client-seitige code:
getSomeJSONDataFromServer:function() {
var deferred = $q.defer();
$http({
method: 'POST',
withCredentials: true,
url: "http://domain.name/app/someURL",
headers:{
'Accept':'application/json',
'Content-Type':'application/json; charset=utf-8',
'Access-Control-Request-Headers': 'X-Requested-With, content-type, accept, origin, withcredentials'
}
})
.success(function(data, status, headers, config) {
//handle data
})
.error(function(data, status, headers, config) {
//handle error
});
return deferred.promise;
}
Den code oben funktioniert OK:
Die Probleme beginnen, wenn ich senden einige Daten in der oben genannten POST-request-body.
...
$http({
method: 'POST',
withCredentials: true,
url: "http://domain.name/app/someURL",
headers:{
'Accept':'application/json',
'Content-Type':'application/json; charset=utf-8',
'Access-Control-Request-Headers': 'X-Requested-With, content-type, accept, origin, withcredentials'
},
data: '{}'
})
.success(...
Den obigen code nicht in die prelight Anfrage:
Sieht aus wie der server eine neue Sitzung startet, weil der session-cookie nicht gesendet wird, aus irgendeinem Grund. Wie auch immer, ich fühle mich wie ich bin etwas fehlt wirklich einfach, einige header oder sowas in der Art...
Alle Ideen sind willkommen. Vielen Dank im Voraus.
- Es scheint ein Problem von Cross-Domain-Aufruf. AJAX-Aufrufe nur zu senden Cookies, wenn Sie die url, die Sie aufrufen ist die die auf der gleichen Domäne wie der aufrufende Skript.
- Ja, definitiv ist es ein CORS nennen. Und es funktioniert, bis Sie das hinzufügen Körper, um die Anfrage...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Amir,
Erlauben Sie mir, helfen Sie sich und anderen klar zu verstehen, was erwartet wird, wenn der Umgang mit CORS, die als solche:
Index:
Einfache CORS-Version
Preflight CORS Version
Anfragen mit Credentials
Laut Cross-Origin-Anfrage mit Preflight-Spezifikationen Anmeldeinformationen, also session-cookie, der ist nicht geschickt in das preflight-Anfrage, deshalb die Lösung ist das deaktivieren der Sicherheit auf OPTIONEN-Anforderungen auf Ihren REST server-Seite und ermöglichen, Anfragen ohne session-cookie wird nur für die OPTIONEN Anfragen.
Natürlich vorsichtig sein, um nicht zu deaktivieren, Sicherheit für das POST-und GET-Anfragen.
Laut https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Damit cookie in der POST, benötigen, konfigurieren Sie die Fernbedienung mit dem Access-Control-Allow-Credentials: true.
Wenn Sie mit jetty, die Sie benötigen, konfigurieren Sie die
Zitieren und von der MDN-Artikel,
Wichtiger Hinweis: als Reaktion auf eine authentifizierte Anfrage-server muss eine Domäne angegeben werden, und nicht verwenden, wilden Karden. Das obige Beispiel würde fehlschlagen, wenn der header war als Wildcard: Access-Control-Allow-Origin:*". Da die Access-Control-Allow-Origin explizit erwähnt http://foo.example, werden die Anmeldeinformationen - -cognizant Inhalt wird zurückgegeben, um den Aufruf von web-Inhalten.