Uma resposta AJAX pode definir um cookie?

266

Uma resposta AJAX pode definir um cookie? Caso contrário, qual é a minha solução alternativa? Devo defini-lo com Javascript ou algo semelhante?

Billworth Vandory
fonte
Estou usando o node.js Express. Notei que, se você fizer isso, precisará definir o campo httpOnly como false no lado do servidor, aparentemente.
Chong Lip Phang

Respostas:

247

Sim , você pode definir um cookie na solicitação AJAX no código do servidor, assim como faria com uma solicitação normal, pois o servidor não pode diferenciar entre uma solicitação normal ou uma solicitação AJAX.

As solicitações AJAX são apenas uma maneira especial de solicitar ao servidor, o servidor precisará responder novamente como em qualquer solicitação HTTP. Na resposta da solicitação, você pode adicionar cookies.

isto. __curious_geek
fonte
39
Lembre-se de que se o cookie será respeitado pelo agente HTTP é outra história.
Franci Penov
6
@Franci: concordou. Mas acho que a pergunta só faz sentido para clientes http que suportam cookies. Portanto, todo solicitante de pergunta deseja saber apenas se os cookies podem ser escritos na solicitação AJAX, o que significa que seu UA suporta cookies :)
isso. __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
Isso responde se o servidor puder responder a uma solicitação ajax com um cabeçalho Set-Cookie. E é claro que pode, mas a questão é se essa resposta realmente resultará no fato de o cliente ler e definir o cookie recebido na resposta ajax ou se deve ser feito manualmente. Esta não é uma resposta para isso.
21416 Alex
2
As solicitações do @Legends Ajax geralmente têm o cabeçalho X-Requested-With definido como XMLHttpRequest, é assim que elas podem ser identificadas, mas uma solicitação pode ser feita sem esse cabeçalho; se isso acontecer, não poderá ser distinguido do carregamento normal da página
T0m
292

De acordo com a seção 4.6.3 da especificação w3, para XMLHttpRequest, um agente do usuário deve respeitar o cabeçalho Set-Cookie. Portanto, a resposta é sim, você deve ser capaz.

Cotação:

Se o agente do usuário suportar o Gerenciamento de Estado HTTP, ele deverá persistir, descartar e enviar cookies (conforme recebido no cabeçalho de resposta Set-Cookie e enviado no cabeçalho de Cookie) conforme aplicável.

Strelok
fonte
1
O IE suporta o cabeçalho Set-Cookie nas respostas, no caso de respostas XHR?
detj 10/10/12
Como deveria em um redirecionamento, e não é respeitado em alguns navegadores.
Walter Macambira
1
Para mim, usando o Chrome, os cabeçalhos recebidos em solicitações de ajax serão aplicados automaticamente ao cliente.
21416 Alex
Descobri que, se o lado do servidor estiver atrasando a resposta como gzip, o cookie não será definido. Isso deveria fazer parte da especificação ou é apenas um problema de implementação?
Juminoz
89

Para o registro, lembre-se de que todas as opções acima são verdadeiras (ainda) somente se a chamada AJAX for feita no mesmo domínio. Se você deseja definir cookies em outro domínio usando o AJAX, está abrindo uma lata de worms totalmente diferente . A leitura de cookies entre domínios funciona, no entanto (ou pelo menos o servidor os serve; se o UA do seu cliente permite que seu código os acesse é, novamente, um tópico diferente; a partir de 2014).

Bogdan Stăncescu
fonte
26
Para enviar cookies entre domínios, você precisa definir o withCredentials flag
aeosynth
5
Para o cenário entre domínios, três coisas precisam acontecer: - (1) O cliente precisa definir withCredentials=trueo xhrobjeto (2) Defina Access-Control-Allow-Credentialstanto na solicitação de comprovação de OPÇÕES quanto na solicitação real (3) Defina o cookie conforme necessário
Kunal
6

Verifique também se o servidor não está configurando cookies seguros em uma solicitação não http. Acabei de descobrir que minha solicitação ajax estava recebendo uma sessão php com o conjunto "seguro". Como eu não estava no https, não estava enviando de volta o cookie da sessão e minha sessão estava sendo redefinida em cada solicitação de ajax.

Phil
fonte
você pode me dizer, onde posso verificar se o ajax está seguro?
Ziumper 22/01/19
1
Não é realmente específico do Ajax. Verifique se há "Seguro" na resposta do cabeçalho Set-Cookie do servidor, se você estiver usando http: // inseguro
Phil