【发布时间】:2011-03-21 10:14:33
【问题描述】:
AJAX 响应可以设置 cookie 吗?如果不是,我的替代解决方案是什么?我应该用 Javascript 还是类似的东西来设置它?
【问题讨论】:
-
我正在使用 node.js Express。我注意到如果你这样做,你显然也必须在服务器端将 httpOnly 字段设置为 false。
AJAX 响应可以设置 cookie 吗?如果不是,我的替代解决方案是什么?我应该用 Javascript 还是类似的东西来设置它?
【问题讨论】:
根据w3 spec section 4.6.3 for XMLHttpRequest,用户代理应该遵守 Set-Cookie 标头。所以答案是肯定的,你应该可以。
引用:
如果用户代理支持 HTTP 状态管理,它应该保持不变, 丢弃并发送 cookie(在 Set-Cookie 响应中收到) 标头,并在 Cookie 标头中发送)(视情况而定)。
【讨论】:
是的,您可以在服务器端代码中的 AJAX 请求中设置 cookie,就像对正常请求所做的那样,因为服务器无法区分正常请求或 AJAX 请求。
AJAX 请求只是向服务器请求的一种特殊方式,服务器需要像在任何 HTTP 请求中一样做出响应。在请求的响应中,您可以添加 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
作为记录,请注意,仅当 AJAX 调用是在同一域上进行时,以上所有内容(仍然)是正确的。如果您正在考虑使用 AJAX 在另一个域上设置 cookie,那么您将打开一个完全不同的 can of worms。但是,读取跨域 cookie 确实有效(或者至少服务器为它们提供服务;您的客户端的 UA 是否允许您的代码访问它们,这又是一个不同的话题;截至 2014 年,它们确实如此)。
【讨论】:
xhr 对象设置 withCredentials=true (2) 在 OPTIONS 预检请求中设置 Access-Control-Allow-Credentials以及实际请求(3)根据需要设置cookie
还要检查您的服务器是否没有在非 http 请求上设置安全 cookie。刚刚发现我的 ajax 请求正在获得一个带有“安全”设置的 php 会话。因为我不在 https 上,所以它没有发回会话 cookie,并且我的会话在每个 ajax 请求上都被重置。
【讨论】: