Une réponse AJAX peut-elle créer un cookie?

266

Une réponse AJAX peut-elle créer un cookie? Sinon, quelle est ma solution alternative? Dois-je le définir avec Javascript ou quelque chose de similaire?

Billworth Vandory
la source
J'utilise node.js Express. J'ai remarqué que si vous faites cela, vous devez également définir le champ httpOnly sur false côté serveur.
Chong Lip Phang

Réponses:

248

Oui , vous pouvez définir un cookie dans la demande AJAX dans le code côté serveur comme vous le feriez pour une demande normale, car le serveur ne peut pas faire la différence entre une demande normale ou une demande AJAX.

Les demandes AJAX ne sont qu'un moyen spécial de demander au serveur, le serveur devra répondre comme dans toute demande HTTP. En réponse à la demande, vous pouvez ajouter des cookies.

ce. __curious_geek
la source
40
Gardez à l'esprit que si le cookie sera honoré par l'agent HTTP est une autre histoire.
Franci Penov
6
@Franci: d'accord. Mais je pense que la question n'a de sens que pour les clients http qui prennent en charge les cookies. Ainsi, tout demandeur de questions souhaite seulement savoir si les cookies peuvent être écrits dans une demande AJAX, ce qui signifie que son UA ​​prend en charge les cookies :)
ceci. __curious_geek
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.- de w3.org/TR/XMLHttpRequest
smwikipedia
12
Cela répond si le serveur peut répondre à une demande ajax avec un en-tête Set-Cookie. Et bien sûr, c'est possible, mais la question est de savoir si cette réponse entraînera réellement la lecture et la définition du cookie reçu par le client dans la réponse ajax, ou si elle doit être effectuée manuellement. Ce n'est pas une réponse à cela.
Alex
2
@Legends Les requêtes Ajax ont généralement l'en-tête X-Requested-With défini sur XMLHttpRequest, c'est ainsi qu'elles peuvent être identifiées, mais une demande peut être effectuée sans cet en-tête, si cela se produit, elle ne peut pas être distinguée d'un chargement de page normal
T0m
293

Selon la section 4.6.3 de la spécification w3 pour XMLHttpRequest, un agent utilisateur doit respecter l'en-tête Set-Cookie. La réponse est donc oui, vous devriez pouvoir.

Devis:

Si l'agent utilisateur prend en charge la gestion d'état HTTP, il doit persister, supprimer et envoyer des cookies (tels que reçus dans l'en-tête de réponse Set-Cookie et envoyés dans l'en-tête Cookie), le cas échéant.

Strelok
la source
1
IE prend-il en charge l'en-tête Set-Cookie dans les réponses, en cas de réponses XHR?
detj
Comme il se doit sur une redirection, et il ne respecte pas certains navigateurs.
Walter Macambira
1
Pour moi qui utilise Chrome, les en-têtes reçus dans les demandes ajax seront automatiquement appliqués au client.
Alex
J'ai constaté que si le côté serveur redéfinit la réponse en tant que gzip, le cookie n'est pas défini. Est-ce censé faire partie de la spécification ou s'agit-il simplement d'un problème de mise en œuvre?
juminoz
89

Pour mémoire, sachez que tout ce qui précède n'est (encore) vrai que si l'appel AJAX est effectué sur le même domaine. Si vous cherchez à configurer des cookies sur un autre domaine à l'aide d'AJAX, vous ouvrez une boîte de vers totalement différente . La lecture des cookies interdomaines fonctionne cependant (ou du moins le serveur les sert; si l'AU de votre client autorise votre code à y accéder est, encore une fois, un sujet différent; depuis 2014, ils le font).

Bogdan Stăncescu
la source
26
Pour envoyer des cookies interdomaines , vous devez définir l' indicateur
withCredentials
5
Pour un scénario interdomaine, 3 choses doivent se produire: - (1) Le client doit définir withCredentials=truepour l' xhrobjet (2) Définir à la Access-Control-Allow-Credentialsfois dans la demande de contrôle en amont OPTIONS ainsi que dans la demande réelle (3) Définir le cookie selon les besoins
Kunal
6

Vérifiez également que votre serveur ne définit pas de cookies sécurisés sur une demande non http. Je viens de découvrir que ma demande ajax recevait une session php avec un ensemble "sécurisé". Parce que je n'étais pas sur https, il ne renvoyait pas le cookie de session et ma session était réinitialisée à chaque demande ajax.

Phil
la source
pouvez-vous me dire où je peux vérifier si ajax secure est défini?
Ziumper
1
Ce n'est pas vraiment spécifique à ajax. Vérifiez « Secure » dans la réponse d' en- tête Set-Cookie à partir du serveur si vous utilisez l' insécurité http: //
Phil