Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

同名 Cookie 的顺序问题

  在以前的文章中我曾介绍过同名 Cookie 的问题。如果一个域下同时来自多个域的同名 Cookie,那么这些 Cookie 将同时存在。但浏览器并没有提供一套获取某个 Cookie 对应的域名这样的接口。所以即使我们拿到了一堆同名 Cookie 也不知道如何从中找到正确的那个。
  一开始我的想法是根据顺序来取最后操作的那个 Cookie。但经过一堆测试之后发现浏览器的实现都不同。Chrome 会把最后编辑的 Cookie 保存到末尾;Firefox 则是在创建 Cookie 时保存到末尾,编辑时不变。虽然 IE 之类的浏览器我没测过,但我知道了同名 Cookie 的顺序是没有规范的。不能依赖这个来判断。
  我们无法找到最后操作的那个 Cookie,但也许可以找到当前域下的 Cookie。因为我们可以先取出同名 Cookie 的所有值,然后尝试写入当前域名下的这个 Cookie,看看是原先的哪个变化了。这时取原先的那个值即可得到当前域下的 Cookie 值,然后把原理的值再重新写回去,不破坏原来的 Cookie 值。
  虽然这个做法可以将 Cookie 定位到某个域上,但这也会带来一些问题。浏览器没有提供获取 Cookie 其它配置参数的方法,比如 Expires。我们编辑 Cookie 就会破坏这些配置。除非我们事先知道这些配置是什么,比如某个 Cookie 的 Expires 被设置为 100 年,那就意味着我们需要让这个 Cookie 永远不过期,那么设置 Cookie 的时候就一直带上这个 100 年的 Expires 即可。
  这个方法虽然有副作用,但至少还是可以在前端勉强检测到 Cookie 的域名。如果是后端呢?由于后端不能对用户的 Cookie 做一次尝试性的写入再重置,所以这个方法是无法使用的。目前我也想不出什么好办法让后端直接识别同名 Cookie 的域。也许只能从业务代码上做一些调整来避免这样的问题吧?
  最后我还想喷一句,Cookie 的设计真是够烂的。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^