2013-01-07 10 views
15

mio web app è fatto in modo che quando un utente accede al server aggiunge un'intestazione Set-Cookie alla risposta, in questo modo:

Set-Cookie:JSESSIONID=1; Path=/myApp/; Secure

al logout Cerco di eliminare questo cookie sul client (browser), in quanto non mi interessa se la sessione è stata distrutta con successo sul server fintanto che il cookie viene eliminato. Eventuali sessioni "fantasma" persistenti verranno pulite di volta in volta sul server.

Tuttavia, la mia app non è in grado di eliminare il cookie JSESSIONID. Di 'la funzione di logout è stato chiamato dal https://test.myserver.com/myApp/app/index.html#/mySubPage e la funzione di logout fa:

delete $cookies["JSESSIONID"]; 
$location.path("/login"); 

Il cookie non viene eliminato. L'aggiornamento dell'elenco dei cookie nella scheda "Risorse" in Strumenti per sviluppatori di Chrome mostra che è ancora lì. Ricaricare la pagina di accesso e aggiornare l'elenco dei cookie nella scheda "Risorse" mostra ancora il cookie.

Perché non riesco a eliminare il cookie dal mio client Javascript quando non è un cookie HTTPOnly? È il percorso che sta causando problemi? Non dovrebbe essere, poiché lo script è in esecuzione su una pagina inclusa nel percorso del cookie. I cookie non sono così difficili da gestire normalmente, quindi sono ben consapevole che potrebbe esserci qualcosa di banale che sto trascurando qui - ma qualsiasi aiuto sarebbe molto apprezzato.

UPDATE:

avevo dato la strada sbagliata per la mia app nel mio post originale. Ora è modificato per riflettere il percorso corretto (bene, astratto). Si scopre che questa era una informazione critica per la domanda. AngularJS utilizza il percorso relativo completo dell'app come attributo path di tutti i cookie che crea/elimina, quindi dal momento che il nostro server ha impostato il cookie con un percorso di /myApp/ e l'app era in esecuzione sul relativo percorso di /myApp/app, Angular stava cercando di eliminare il precedente cookie, che non esiste (per sovrascrivere o eliminare un cookie esistente il nome, il dominio e il percorso devono essere tutti identici a quelli utilizzati durante la creazione del cookie).

+0

Hai incluso ngCookie nel tuo modulo? Come angular.module ('myApp', ['ngCookies']) – asgoth

+0

Sì. Posso leggere il cookie senza problemi. Non ricevo errori da nessuna parte, il cookie rimane semplicemente inserito anche se avrebbe dovuto essere eliminato. –

+1

Hai provato con $ cookieStore.remove (chiave)? – asgoth

risposta

11

Suppongo che dovresti controllare le risposte dal server - forse includono un campo di intestazione "set cookie" che imposta il valore del cookie.

Questo è un Plunker example che illustra come è possibile aggiungere/modificare/eliminare/controllare il valore del cookie (ma senza le risposte lato server che possono modificare i valori del cookie).

Generalmente, $ cookie object è una sorta di 'oggetto proxy' che è tracciato a due vie dal modulo ngCookies di AngularJS e da un lato cambia i suoi campi quando i cookie del browser sono cambiati (quindi puoi $ guardare le modifiche) ma anche le modifiche si riflettono sui cookie reali del browser, quindi puoi modificare questo oggetto.

Quindi l'unico motivo per cui i cookie non possono essere eliminati è che li elimini sul browser, e il server imposta nuovamente il cookie e dopo aver ricaricato la pagina è ancora lì.

+0

Ho controllato la risposta dal server, e non aveva i cookie bloccati :( –

+0

+1 per fornire una buona spiegazione e buoni esempi di utilizzo del servizio $ cookie.Tuttavia, non ha risolto il problema per me così posso segnalo come risposta accettataÈ colpa mia se non è stato possibile rispondere alla domanda, poiché è stato commesso un errore cruciale quando ho scritto la domanda (percorso di applicazione errato). Ho aggiornato la domanda con il percorso corretto e la spiegazione di ciò che il problema si è rivelato. –

3

La risposta che hai dato nell'aggiornamento sembra essere corretta: Angular $cookieStore può funzionare solo su cookie il cui valore di percorso è uguale al percorso corrente.

Il modo per ingannare è quello di utilizzare la soluzione data dalla ajspera su this issue:

<head> 
    <base href="/"> 
</head> 

Basta aggiungere <base href="/"> al vostro elemento capo del HTML, ea quel punto funziona.

La soluzione alternativa è impostare il percorso del cookie utilizzando il server che lo ha inviato. In Node.js Express, che si presenta come

res.cookie('specialCookie', 'special!', {path: '/myApp'}); 

Si noti che per me sembra come $ cookieStore estrae la barra finale, quindi potrebbe essere necessario provare entrambe le cose.

+0

Grazie per aver fornito istruzioni su come risolvere questo problema. Ho avuto l'approccio base href funzionante, ma penso che potrebbero esserci [conseguenze indesiderabili] (http://stackoverflow.com/questions/1889076/is-it-recommended-to-use-the-base-html-tag), quindi preferirei impostare il percorso dal server ... ma non riesco a capire da dove dovrebbe arrivare il valore di "/ myApp". Sono in esecuzione su localhost: 8080/mypage.html, con l'argomento di angular.module 'theApp'. Tuttavia, l'impostazione del percorso su "",/theApp o/theApp/non comporta alcun accesso angolare al cookie. – Dev93

+0

"/ myApp" è l'opzione di percorso per il cookie che stai inviando. Nel tuo caso dovresti usare "/mypage.html". In alternativa, puoi provare nessuna opzione di percorso (predefinita per il percorso dell'URL di richiesta) o forse "/ mypage". – srlm

+0

Ma voglio che il cookie sia disponibile per tutte le pagine del mio sito. Come posso farlo? Nella domanda del poster originale, ha argomento site/myapp/app/index.html #, ma solo riferimenti myapp/app nella soluzione. – Dev93

4

Attenzione al dominio dei cookie del cookie che si desidera eliminare. Se stai lavorando con più sottodomini (ad esempio uno per le risorse statiche, un altro per l'API) il tuo problema potrebbe essere che stai cercando di eliminare un cookie per il dominio sbagliato.

Dai un'occhiata ai tuoi cookie con lo strumento di sviluppo del tuo browser preferito. Qualunque dominio sia impostato per il cookie che vuoi eliminare e con cui stai avendo problemi, specificalo nel parametro options al metodo remove.

$cookies.remove('JSESSIONID', {domain: 'domain.tld'}); 

SICUREZZA SUGGERIMENTO: Eliminare l'ID di sessione tramite Javascript non elimina la sessione sul server. Se i tuoi ID di sessione perdono potresti subire la fissazione della sessione. Sarebbe meglio cancellare il cookie chiamando un endpoint di disconnessione nella propria API che cancellerebbe completamente la sessione sul server in modo che non possa essere riutilizzato.

+0

Come l'OP, il mio problema riguardava il percorso, non il dominio, ma l'impostazione del percorso nelle opzioni ha finalmente eliminato il cookie per me. Questa è la risposta che mi ha indirizzato nella giusta direzione. – Danny

+0

Ho provato molte soluzioni, ma questa è l'unica che mi ha soddisfatto: Impostazione del percorso AND dominio durante la rimozione del cookie: $ cookies.remove ("sessionId", {percorso: "/", dominio: " mydomain.fr "}); – tchoum

Problemi correlati