¿Puede una respuesta AJAX establecer una cookie?

266

¿Puede una respuesta AJAX establecer una cookie? Si no, ¿cuál es mi solución alternativa? ¿Debo configurarlo con Javascript o algo similar?

Billworth Vandory
fuente
Estoy usando node.js Express. Me di cuenta de que si haces eso, aparentemente también debes establecer el campo httpOnly en falso en el lado del servidor.
Chong Lip Phang

Respuestas:

248

, puede configurar la cookie en la solicitud AJAX en el código del lado del servidor tal como lo haría para una solicitud normal, ya que el servidor no puede diferenciar entre una solicitud normal o una solicitud AJAX.

Las solicitudes AJAX son solo una forma especial de solicitar al servidor, el servidor deberá responder como en cualquier solicitud HTTP. En la respuesta de la solicitud, puede agregar cookies.

esta. __curious_geek
fuente
40
Tenga en cuenta que si el agente HTTP honrará la cookie es otra historia.
Franci Penov
66
@Franci: de acuerdo. Pero creo que la pregunta solo tiene sentido para los clientes http que admiten cookies. Por lo tanto, todos los que preguntan solo desean saber si las cookies se pueden escribir en la solicitud de AJAX, lo que significa que su UA admite cookies :)
esto. __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
Esto responde si el servidor puede responder a una solicitud ajax con un encabezado Set-Cookie. Y, por supuesto, puede, pero la pregunta es si esa respuesta realmente dará como resultado que el cliente lea y establezca la cookie recibida en la respuesta ajax, o si debe hacerse manualmente. Esta no es una respuesta para eso.
Alex
2
Las solicitudes de @Legends Ajax generalmente tienen el encabezado X-Requested-With establecido en XMLHttpRequest, así es como se pueden identificar, pero se puede realizar una solicitud sin este encabezado, si esto sucede no se puede distinguir de una carga de página normal
T0m
293

De acuerdo con la sección 4.6.3 de especificaciones de w3 para XMLHttpRequest, un agente de usuario debe respetar el encabezado Set-Cookie. Entonces la respuesta es sí, deberías poder hacerlo.

Cotización:

Si el agente de usuario es compatible con HTTP State Management, debe persistir, descartar y enviar cookies (como se reciben en el encabezado de respuesta Set-Cookie y se envían en el encabezado de Cookie) según corresponda.

Strelok
fuente
1
¿Es compatible IE con el encabezado Set-Cookie en las respuestas, en caso de respuestas XHR?
detj
Como debería en un redireccionamiento, y no cumple en algunos navegadores.
Walter Macambira
1
Para mí usando Chrome, los encabezados recibidos en las solicitudes ajax se aplicarán automáticamente al cliente.
Alex
Descubrí que si el lado del servidor está configurando la respuesta como gzip, la cookie no se configura. ¿Se supone que eso es parte de la especificación o es solo un problema de implementación?
juminoz
89

Para el registro, tenga en cuenta que todo lo anterior es (aún) verdadero solo si la llamada AJAX se realiza en el mismo dominio. Si está buscando configurar cookies en otro dominio usando AJAX, está abriendo una lata de gusanos totalmente diferente . Sin embargo, la lectura de cookies entre dominios sí funciona (o al menos el servidor las sirve; si el UA de su cliente permite que su código acceda a ellas es, nuevamente, un tema diferente; a partir de 2014 lo hacen).

Bogdan Stăncescu
fuente
26
Para enviar las cookies de varios dominios, es necesario establecer el withCredentials bandera
aeosynth
55
Para el escenario entre dominios, deben suceder 3 cosas: - (1) El cliente debe configurar withCredentials=trueel xhrobjeto (2) Establecer Access-Control-Allow-Credentialstanto en la solicitud de verificación previa de OPTIONS como en la solicitud real (3) Configurar la cookie según sea necesario
Kunal
6

También verifique que su servidor no esté configurando cookies seguras en una solicitud que no sea http. Me acabo de enterar de que mi solicitud de AJAX estaba obteniendo una sesión de PHP con el conjunto "seguro". Como no estaba en https, no estaba devolviendo la cookie de sesión y mi sesión se restablecía en cada solicitud de ajax.

Phil
fuente
¿me puede decir, donde puedo verificar si ajax secure está configurado?
Ziumper el
1
No es realmente ajax específico. Compruebe si está "Seguro" en la respuesta del encabezado Set-Cookie del servidor si está utilizando http inseguro: //
Phil