2013-06-12 7 views
65

Wir arbeiten an einem RESTful Webservice mit AngularJS und Java Servlets. Wenn sich der Benutzer anmeldet, sendet unser Backend einen Header "Set-Cookie" an das Frontend. In Angular greifen wir über $cookies (ngCookie - Modul) auf die Kopfzeile zu und stellen sie ein. enter image description here

Jetzt, wo der Benutzer eingeloggt ist, kann er zum Beispiel einige Sachen löschen. Daher sendet das Frontend eine GET-Anfrage an das Backend. Weil wir auf verschiedene Domains arbeiten müssen wir einige CORS-Header setzen und Angular hat eine OPTIONS-Anforderung vor der eigentlichen GET-Anfrage:

OPTIONS Anfrage: OPTIONS request

GET-Anfrage GET request

Wir tun dies in Angular via $ http-Modul, aber es wird einfach nicht den Cookie senden, der JSESSIONID enthält.

Wie kann ich Angular Cookies senden?

Antwort

129

In der Config, DI $httpProvider und setzen withCredentials auf true:

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

Info auf AngularJS withCredentials: http://docs.angularjs.org/api/ng.$http

, die zu den mozilla Artikel Links: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control#section_5

+6

Dies und das Setzen der Backend-Header auf Allow-Credentials behoben das Problem! Vielen Dank! –

+10

Nur um hinzuzufügen, bemerkte ich, als ich einen Anruf wie '$ http.get ('etwas', {withCredentials: true})' der Browser schickte die Cookies nicht. Die Verwendung des obigen Codes zum Hinzufügen von 'withCredentials' zu den Standardeinstellungen hat jedoch den Zweck erfüllt. Nicht sicher warum, aber hoffentlich hilft das, wenn jemand anderes über dieses Problem hinwegläuft. –

+0

Das hat mein Leben ein wenig einfacher gemacht, danke. – Seiyria

8
$http.get("URL", { withCredentials: true }) 
    .success(function(data, status, headers, config) {}) 
    .error(function(data, status, headers, config) {}); 

Eine andere Sache zu beachten: Sie müssen 3rd Party Cookies aktiviert haben. Wenn Sie es in Chrome global deaktiviert haben, klicken Sie auf das "i" -Symbol links neben dem Domain-Namen, dann auf Cookies, dann "Blockieren" und entsperren Sie die Ziel-Domain.

+1

Dieser Ansatz funktionierte bei mir in AngularJS2 .... aber erst nach der Session, die ich erstellt habe, änderte sich mein Quellcode ab! – HDave