能否在服务器端处理 Ajax (XHR) 调用期间可靠地设置或删除 cookie?

Can you reliably set or delete a cookie during the server side processing of an Ajax (XHR) call?

提问人:Peter 提问时间:9/18/2008 更新时间:5/28/2009 访问量:2971

问:

我自己对此做了一些测试(确切地说,是在 DWR 框架 Ajax 请求处理程序的服务器端处理期间),似乎您可以成功操作 cookie,但这与我阅读的有关 Ajax 最佳实践以及浏览器如何解释来自 XmlHttpRequest 的响应的许多内容背道而驰。注意:我已经测试过:

  • IE 6 和 7
  • Firefox 2 和 3
  • Safari 浏览器

在所有情况下,浏览器在 Ajax 请求处理期间对 HttpServletResponse 对象的标准 cookie 操作都得到了正确的解释,但我想知道将 cookie 操作推送到客户端是否是最佳实践,或者这个(更干净)服务器端 cookie 处理是否可以信任。

我欢迎特定于 DWR 框架和 Ajax 的答案。

ajax xmlhttprequest cookies 服务器端 DWR

评论

0赞 Darren Greaves 5/28/2009
我对此感到疑惑,因为我在服务器端 DWR 请求中删除 cookie 时遇到了问题。我可以很好地创建它们,但无法删除它们 - 在假设无法完成之后,我找到了一个无 cookie 的解决方案。

答:

-1赞 Thomas 9/18/2008 #1

在客户端操作 cookie 与“最佳实践”相反。而且也没有必要。HttpOnly cookie 的引入并非无缘无故。

评论

0赞 Ryan Grove 9/18/2008
他没有在客户端上操纵 cookie;他正在服务器上操纵它们以响应 Ajax 请求。在任何情况下,客户端 cookie 操作通常不会被认为是有害的,只要它在 JS 被禁用或不受支持时正常降级。
9赞 64BitBob 9/18/2008 #2

XMLHttpRequest 始终使用 Web 浏览器的连接框架。这是 AJAX 程序正常工作的要求,因为如果 XHR 对象无法访问浏览器的 cookie 池,用户将被注销。

从理论上讲,Web 浏览器可以在不使用浏览器的连接框架的情况下简单地共享会话 cookie,但这在实践中从未发生过(据我所知)。甚至 Flash 插件也使用 Web 浏览器的连接。

因此,最终结果是通过 AJAX 操作 cookie 是安全的。请记住,AJAX 调用可能永远不会发生。它们不是保证的事件,所以不要指望它们。

评论

0赞 Peter 9/19/2008
谢谢,尽管有少量的不同意见,但考虑到我自己的测试结果、投票以及围绕在服务器端集中业务逻辑的一般最佳实践,这是最有意义的。
0赞 64BitBob 9/19/2008
别客气。在为 Flash 和 Javascript 创建多人游戏 API 时,我也在这方面做了相当多的研究。由于 HTTP RFC 施加的 2 个连接限制,我很快就发现我正在使用浏览器的连接。Cookie 确认了此信息。
1赞 Darren Greaves 5/28/2009 #3

在DWR的上下文中,它可能并不“安全”。

通过阅读 DWR 网站,它说:

请务必将 HTTP 请求和响应视为只读。虽然 HTTP 标头可能会通过 OK,但某些浏览器很可能会忽略它们。

我认为这意味着设置 cookie 或请求属性是禁忌。
话虽如此,我有确实设置请求属性的代码(我在阅读该页面之前编写的代码),并且它似乎工作正常(除了删除我在上面的评论中提到的 cookie)。