$ http sendet kein Cookie in Anfragen

70

Wir arbeiten an einem RESTful Webservice mit AngularJS- und Java-Servlets. Wenn sich der Benutzer anmeldet, sendet unser Backend einen "Set-Cookie" -Header an das Frontend. In Angular greifen wir über $cookies(ngCookie - Modul) auf den Header zu und setzen ihn. Geben Sie hier die Bildbeschreibung ein

Nachdem der Benutzer angemeldet ist, kann er beispielsweise einige Inhalte löschen. Daher sendet das Frontend eine GET-Anfrage an das Backend. Da wir an verschiedenen Domänen arbeiten, müssen wir einige CORS-Header festlegen, und Angular führt vor der eigentlichen GET-Anforderung eine OPTIONS-Anforderung aus:

OPTIONEN Anfrage: OPTIONEN Anfrage

GET Anfrage GET Anfrage

Wir tun dies in Angular über das $ http-Modul, aber es sendet einfach nicht das Cookie, das enthält JSESSIONID.

Wie kann ich Angular aktivieren, um Cookies zu senden?

Tim Daubenschütz
quelle

Antworten:

137

In Ihrer Konfiguration DI $httpProviderund dann withCredentials auf true setzen:

.config(function ($httpProvider) {
    $httpProvider.defaults.withCredentials = true;
    //rest of route code
})

Infos zu anglejs withCredentials: http://docs.angularjs.org/api/ng.$http

Welche Links zum Mozilla-Artikel: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=de-US&redirectslug=HTTP_access_control#section_5

Mathew Berg
quelle
6
Dies und das Setzen des Backend-Headers auf Allow-Credentials haben das Problem behoben! Vielen Dank!
Tim Daubenschütz
10
Um das noch zu ergänzen, bemerkte ich, als ich einen Anruf $http.get('something', { withCredentials: true})tätigte, als würde der Browser die Cookies nicht senden. Die Verwendung des obigen Codes zum Hinzufügen withCredentialszu den Standardeinstellungen hat jedoch den Trick getan. Ich weiß nicht warum, aber hoffentlich hilft das, wenn jemand anderes auf dieses Problem stößt
David Savage
4
Bei mir funktioniert es immer noch nicht. Was ich tue, ist, dass der Server bei meiner ersten Antwort ein httpOnly-Cookie gesetzt hat. Wenn ich die zweite Anfrage sende, wurden die für die erste Antwort gesetzten Cookies nie an die zweite Anfrage angehängt.
Qian Chen
1
Es funktioniert in localhost, aber als ich auf einen Server umgezogen bin, funktioniert es nicht. Warum wird kein Cookie auf dem Server gesendet?
Abhilash Augustine
11
$http.get("URL", { withCredentials: true })
  .success(function(data, status, headers, config) {})
  .error(function(data, status, headers, config) {});

Beachten Sie auch Folgendes: Sie müssen Cookies von Drittanbietern aktivieren . Wenn Sie es in Chrome global deaktiviert haben, klicken Sie auf das Symbol "i" links neben dem Domainnamen, dann auf Cookies, dann auf "Blockieren" und entsperren Sie die Zieldomain.

Daniel F.
quelle
1
Dieser Ansatz hat in AngularJS2 für mich funktioniert ... aber erst nach der Sitzung, die ich vor dem Ändern meines Quellcodes erstellt habe!
HDave