Una risposta AJAX può impostare un cookie?


266

Una risposta AJAX può impostare un cookie? In caso contrario, qual è la mia soluzione alternativa? Devo impostarlo con Javascript o qualcosa di simile?


Sto usando node.js Express. Ho notato che se lo fai, devi impostare il campo httpOnly su false sul lato server troppo apparentemente.
Chong Lip Phang,

Risposte:


248

, puoi impostare i cookie nella richiesta AJAX nel codice lato server proprio come faresti per una richiesta normale poiché il server non è in grado di distinguere tra una richiesta normale o una richiesta AJAX.

Le richieste AJAX sono solo un modo speciale di richiedere al server, il server dovrà rispondere come in qualsiasi richiesta HTTP. Nella risposta alla richiesta è possibile aggiungere cookie.


40
Tieni presente che se il cookie verrà onorato dall'agente HTTP è un'altra storia.
Franci Penov,

6
@Franci: d'accordo. Ma penso che la domanda abbia senso solo per i client http che supportano i cookie. Quindi, tutti gli utenti delle domande desiderano solo sapere se i cookie possono essere scritti nella richiesta AJAX, il che significa che la sua UA supporta i cookie :)
questo. __curious_geek il

10
If the user agent supports HTTP State Management it should persist, discard and send cookies (as received in the Set-Cookie response header, and sent in the Cookie header) as applicable.- da w3.org/TR/XMLHttpRequest
smwikipedia

12
Ciò risponde se il server può rispondere a una richiesta Ajax con un'intestazione Set-Cookie. E ovviamente può, ma la domanda è se quella risposta comporterà effettivamente che il client legge e imposta il cookie ricevuto nella risposta ajax o se deve essere fatto manualmente. Questa non è una risposta per questo.
Alex,

2
@Legends Le richieste Ajax di solito hanno l'intestazione X-Requested-With impostata su XMLHttpRequest, ecco come possono essere identificate, ma una richiesta può essere fatta senza questa intestazione, se ciò accade non può essere distinta da un normale caricamento della pagina
T0m

293

In base alla sezione 4.6.3 della specifica w3 per XMLHttpRequest, un agente utente deve rispettare l'intestazione Set-Cookie. Quindi la risposta è sì, dovresti essere in grado di farlo.

Quotazione:

Se l'agente utente supporta la gestione dello stato HTTP, dovrebbe persistere, scartare e inviare i cookie (come ricevuti nell'intestazione della risposta Set-Cookie e inviati nell'intestazione dei Cookie) come applicabile.


1
IE supporta l'intestazione Set-Cookie nelle risposte, in caso di risposte XHR?
detj,

Come dovrebbe su un reindirizzamento, e non onora in alcuni browser.
Walter Macambira,

1
Per me usando Chrome, le intestazioni ricevute nelle richieste Ajax verranno automaticamente applicate al client.
Alex,

Ho scoperto che se il lato server sta ripristinando la risposta come gzip, il cookie non viene impostato. Dovrebbe essere parte delle specifiche o è solo un problema di implementazione?
juminoz,

89

Per la cronaca, tieni presente che tutto quanto sopra è (ancora) vero solo se la chiamata AJAX viene effettuata sullo stesso dominio. Se stai cercando di impostare i cookie su un altro dominio utilizzando AJAX, stai aprendo una lattina di worm completamente diversa . La lettura dei cookie tra domini funziona, tuttavia (o almeno il server li serve; se UA del tuo cliente consente al tuo codice di accedervi è, ancora una volta, un argomento diverso; dal 2014 lo fanno).


26
Per inviare i cookie tra domini, è necessario impostare il withCredentials bandiera
aeosynth

5
Per lo scenario tra domini, devono accadere 3 cose: - (1) Il client deve impostare withCredentials=truel' xhroggetto (2) Impostare Access-Control-Allow-Credentialssia nella richiesta di preflight OPTIONS che la richiesta effettiva (3) Impostare il cookie secondo necessità
Kunal

6

Controlla anche che il tuo server non stia impostando cookie sicuri su una richiesta non http. Ho appena scoperto che la mia richiesta Ajax stava ottenendo una sessione PHP con set "sicuro". Poiché non ero su HTTPS, non stava inviando nuovamente il cookie di sessione e la mia sessione veniva reimpostata su ogni richiesta Ajax.


puoi dirmi, dove posso verificare se è impostato Ajax Secure?
Ziumper,

1
Non è proprio specifico per Ajax. Controlla "Sicuro" nella risposta dell'intestazione Set-Cookie dal server se stai utilizzando http: // non sicuro
Phil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.