Http 如何处理多个同名cookie?
例如,我让一个应用程序发送以下HTTP头,将其设置为名为“a”的cookie: 如果我在服务器上访问Http 如何处理多个同名cookie?,http,cookies,Http,Cookies,例如,我让一个应用程序发送以下HTTP头,将其设置为名为“a”的cookie: 如果我在服务器上访问/example,两个路径都是有效的,因此我有两个名为“a”的cookie!由于浏览器不发送任何路径信息,因此无法区分这两个cookie Cookie: a=2; a=1 这个案件应该如何处理?挑第一个?是否创建包含所有cookie值的列表?或者,这种情况应该被视为开发人员的错误吗?如果需要区分它们,则必须为它们指定不同的键值。我当然知道,有一些应用程序广泛使用多个会话ID来实现这一点,并且似乎
/example
,两个路径都是有效的,因此我有两个名为“a”的cookie!由于浏览器不发送任何路径信息,因此无法区分这两个cookie
Cookie: a=2; a=1
这个案件应该如何处理?挑第一个?是否创建包含所有cookie值的列表?或者,这种情况应该被视为开发人员的错误吗?如果需要区分它们,则必须为它们指定不同的键值。我当然知道,有一些应用程序广泛使用多个会话ID来实现这一点,并且似乎能够始终如一地工作。但是我不知道——也不打算知道——他们是否这样做,因为浏览器返回cookie的顺序是一致的,这取决于cookie的设置时间/设置路径,或者应用程序是否尝试将每个cookie与现有会话相匹配 我强烈建议避免这种做法 但是,如果您真的想知道浏览器(和应用程序)如何处理这种情况,为什么不构建一个测试平台并尝试一下呢。来自: 如果多个同名cookie与给定的请求URI匹配,则浏览器会选择一个 路径越具体,优先级越高。但是,基于其他属性(包括域)的优先级未指定,并且可能因浏览器而异。这意味着,如果您对“.example.org”和“www.example.org”设置了相同名称的cookie,则无法确定将返回哪个cookie
编辑:2010年的这些信息似乎已经过时,浏览器现在似乎可以发送多个cookie作为回报,请参阅下面@Nate的答案以了解详细信息为同一名称提供多个值没有什么错。。。如果你想要的话。您甚至可以在值中嵌入其他上下文 如果您不这样做,那么如果您想要两种上下文,那么当然可以使用不同的名称 另一种方法是发送具有相同路径(和域)的相同cookie名称,甚至从更具体的路径发送。这些设置cookie指令将覆盖该cookie的值
既然您知道了最重要的部分(它们是如何工作的),并且您可以通过几种不同的方式完成所需的工作,那么我对您的问题的回答是:这是一个开发人员问题。关于SitePoint上文章的答案并不完全完整。请参阅(公平地说,该RFC是在2011年发布的,在该问题发布后,该RFC取代了2000年和1997年发布的RFC) 第2节第2小节规定: 用户代理应按以下顺序对cookie列表进行排序:
- 路径较长的Cookie列在路径较短的Cookie之前
- 设置cookie:a-global=1;路径=/;版本=1
- 设置cookie:a-example=2;Path=/示例;版本=1
- 设置cookie:a=1&path=/;路径=/;版本=1
- 设置cookie:a=2&path=/example;Path=/示例;版本=1
这两种解决方法都需要服务器上的附加逻辑来选择所需的cookie值,方法是将请求的URL与可用cookie列表进行比较。不太漂亮。不幸的是,RFC没有预见性地要求较长的路径完全用较短的路径覆盖cookie(例如:在您的示例中,您将收到cookie:a=2仅)。如果您使用Java/Scala框架,播放:小心!如果一个请求包含多个同名cookie,Play将只向您的代码显示其中一个cookie。我会尽最大努力(阅读:尽我所能)避免重复cookie名称。大多数人从未遇到过这个问题——这是有原因的。网站只能读取自己的cookie。它无法读取其他网站/域的cookie。这种安全性由浏览器来保证。这可能是给初学者的提示(我有点困惑)服务器无法控制浏览器发送给它的内容。它仍然需要处理。那么如何删除多个相同的cookie呢?我已经苦思冥想了两天,重复的曲奇饼似乎坚不可摧
Cookie: a=2; a=1