2013-06-12 9 views
65

Stiamo lavorando su un servizio Web RESTful con AngularJS e Java Servlet. Quando l'utente esegue il login, il nostro backend invia un'intestazione "Set-Cookie" al frontend. In Angular accediamo all'intestazione tramite $cookies (ngCookie - module) e lo impostiamo. enter image description here

Ora che l'utente ha effettuato l'accesso può eliminare alcune cose. Pertanto il frontend invia una richiesta GET al back-end. Perché lavoriamo in domini diversi abbiamo bisogno di impostare alcuni CORS intestazioni e angolare fa una richiesta OPTIONS prima che la richiesta GET attuale:

OPZIONI richiesta: OPTIONS request

richiesta GET GET request

Lo facciamo in Angular tramite il modulo $ http, ma semplicemente non invierà il cookie, contenente JSESSIONID.

Come posso consentire ad Angular di inviare cookie?

risposta

129

nella vostra configurazione, DI $httpProvider e quindi impostare withCredentials su true:

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

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

che collega l'articolo di Mozilla: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control#section_5

+6

Questo e l'impostazione dell'intestazione back-end su Allow-Credentials hanno risolto il problema! Grazie! –

+10

Solo per aggiungere a questo, ho notato quando ho fatto una chiamata come '$ http.get ('qualcosa', {withCredentials: true})' il browser non invierà i cookie. Tuttavia, usare il codice sopra per aggiungere 'withCredentials' ai valori predefiniti ha fatto il trucco. Non so perché, ma spero che questo aiuti se qualcun altro incontra questo problema –

+0

Questo mi ha reso la vita un po 'più facile, grazie. – Seiyria

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

Un'altra cosa da tenere a mente: è necessario che abbia abilitato cookie di terze parti. Se hai disabilitato globalmente in Chrome, fai clic sul simbolo "i" a sinistra del nome del dominio, quindi su "cookie", quindi su "bloccato" e sblocca il dominio di destinazione.

+1

Questo approccio ha funzionato per me in AngularJS2 .... ma non fino a dopo la sessione che ho creato prima di cambiare il mio codice sorgente scaduto! – HDave