AJAX响应可以设置cookie吗?


Answers:


247

是的,您可以在服务器端代码中的AJAX请求中设置cookie,就像处理普通请求一样,因为服务器无法区分普通请求还是AJAX请求。

AJAX请求只是向服务器请求的一种特殊方式,服务器将需要像任何HTTP请求一样进行响应。在请求的响应中,您可以添加cookie。


39
请记住,HTTP代理是否接受cookie是另一回事。
弗朗西·佩诺夫

6
@弗朗西:同意。但是我认为这个问题仅对支持cookie的http客户端有意义。因此,所有提问者都只想知道cookie是否可以在AJAX请求中编写,这意味着他的UA支持cookie :)
这。__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.-来自w3.org/TR/XMLHttpRequest
smwikipedia

12
如果服务器可以使用Set-Cookie标头答复ajax请求,则可以回答此问题。当然可以,但是问题是该响应是否会真正导致客户端读取并设置ajax响应中接收到的cookie,或者是否必须手动完成。这不是答案。
Alex

2
@Legends Ajax请求通常将X-Requested-With标头设置为XMLHttpRequest,这是可以识别它们的方式,但是可以在没有此标头的情况下进行请求,如果发生这种情况,则无法将其与正常页面加载区分开
T0m

292

根据w3规范第4.6.3节中关于XMLHttpRequest的规定,用户代理应遵守Set-Cookie标头。因此,答案是肯定的。

报价单:

如果用户代理支持HTTP状态管理,则它应保留,丢弃并发送Cookie(如在Set-Cookie响应标头中接收并在Cookie标头中发送)。


1
在XHR响应的情况下,IE是否在响应中支持Set-Cookie标头?
detj 2012年

由于它应该在重定向上使用,因此在某些浏览器中不适用。
Walter Macambira 2015年

1
对于使用Chrome的我来说,ajax请求中收到的标头将自动应用于客户端。
Alex

我发现如果服务器端将响应设置为gzip,则不会设置cookie。是应该作为规范的一部分还是仅仅是实现问题?
juminoz

89

为了记录在案,请注意,只有在同一域上进行AJAX调用时,以上所有情况(仍然)是正确的。如果您正在考虑使用AJAX在另一个域上设置Cookie,那么您打开的是完全不同的蠕虫病毒。但是,读取跨域cookie确实可以(或者至少由服务器提供它们;客户端的UA是否允许您的代码访问它们又是一个不同的话题;从2014年开始)。


26
要发送跨域Cookie,您需要设置withCredentials标志
aeosynth 2013年

5
对于跨域方案,需要发生3件事情:-(1)客户端需要withCredentials=truexhr对象设置(2)Access-Control-Allow-Credentials在OPTIONS预检请求和实际请求中都进行设置(3)根据需要设置Cookie
Kunal

6

还要检查您的服务器是否未在非http请求上设置安全cookie。刚刚发现我的ajax请求正在获取一个带有“安全”设置的php会话。因为我不在https上,所以它没有发送回会话cookie,并且我的会话在每个ajax请求上都已重置。


您能告诉我,哪里可以检查Ajax安全设置吗?
Ziumper

1
它并不是特定于ajax的。如果您使用的是不安全的http://
Phil,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.