AJAX 响应可以设置 cookie 吗?

Posted

技术标签:

【中文标题】AJAX 响应可以设置 cookie 吗?【英文标题】:Can an AJAX response set a cookie? 【发布时间】:2011-03-21 10:14:33 【问题描述】:

如果不是,我的替代解决方案是什么?我应该用 javascript 还是类似的东西来设置它?

【问题讨论】:

我正在使用 node.js Express。我注意到如果你这样做,你显然也必须在服务器端将 httpOnly 字段设置为 false。 【参考方案1】:

根据w3 spec section 4.6.3 for XMLHttpRequest,用户代理应该遵守 Set-Cookie 标头。所以答案是肯定的,你应该可以。

引用:

如果用户代理支持 HTTP 状态管理,它应该保持不变, 丢弃并发送 cookie(在 Set-Cookie 响应中收到) 标头,并在 Cookie 标头中发送)(视情况而定)。

【讨论】:

在 XHR 响应的情况下,IE 是否支持响应中的 Set-Cookie 标头? 因为它应该在重定向上,它在某些浏览器中不支持。 对于使用 Chrome 的我来说,在 ajax 请求中收到的标头会自动应用到客户端。 我发现如果服务器端将响应设置为 gzip,则不会设置 cookie。这应该是规范的一部分还是只是一个实施问题?【参考方案2】:

是的,您可以在服务器端代码中的 AJAX 请求中设置 cookie,就像对正常请求所做的那样,因为服务器无法区分正常请求或 AJAX 请求。

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

【讨论】:

请记住,cookie 是否会被 HTTP 代理接受是另一回事。 @Franci:同意。但我认为这个问题只对支持 cookie 的 http 客户端有意义。所以所有提问者只想知道cookie是否可以写在AJAX请求中,这意味着他的UA支持cookie:) 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 这会回答服务器是否可以使用 Set-Cookie 标头回复 ajax 请求。当然可以,但问题是该响应是否实际上会导致客户端读取并设置在 ajax 响应中接收到的 cookie,或者是否必须手动完成。这不是一个答案。 @Legends Ajax 请求通常将 X-Requested-With 标头设置为 XMLHttpRequest,这是可以识别它们的方式,但是可以在没有此标头的情况下发出请求,如果发生这种情况则无法区分从正常的页面加载【参考方案3】:

作为记录,请注意,仅当 AJAX 调用是在同一域上进行时,以上所有内容(仍然)是正确的。如果您正在考虑使用 AJAX 在另一个域上设置 cookie,那么您将打开一个完全不同的 can of worms。但是,读取跨域 cookie 确实有效(或者至少服务器为它们提供服务;您的客户端的 UA 是否允许您的代码访问它们,这又是一个不同的话题;截至 2014 年,它们确实如此)。

【讨论】:

发送跨域cookie需要设置withCredentials标志 对于跨域场景,需要发生 3 件事:- (1) 客户端需要为 xhr 对象设置 withCredentials=true (2) 在 OPTIONS 预检请求中设置 Access-Control-Allow-Credentials以及实际请求(3)根据需要设置cookie【参考方案4】:

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

【讨论】:

你能告诉我,我可以在哪里检查是否设置了 ajax 安全? 这并不是真正的 ajax 特定的。如果您使用不安全的 http://,请检查来自服务器的 Set-Cookie 标头响应中的“安全”

以上是关于AJAX 响应可以设置 cookie 吗?的主要内容,如果未能解决你的问题,请参考以下文章

ajax响应时长怎样设置?

为啥 AJAX 请求返回后浏览器不设置 cookie?

Ajax跨域请求携带cookie问题

Django 1.9 AJAX 表单 CSRF 令牌 403 错误 - “未设置 CSRF cookie”

js中cookie可以跨域取值吗

android okhttp3带cookie请求