我们有一个严重依赖cookie的网上商店。 通常情况下,我们有一个订单ID cookie,无论用户在哪里导航以及他们放入购物篮中的商品数量都存在于网站上。如果客户刚刚完成订单(服务器上的订单状态发生变化)或者他们没有此cookie的值,则此cookie仅用于设置/更改。 我们在每次加载页面时检查服务器的订单状态,并仅在满足上述条件时更改cookie。
最近,我的一些同事如果点击浏览器后退按钮就开始遇到奇怪的行为。我将使用同一个cookie的多个唯一版本来解释它 - A,B和C.
到目前为止,我们已经在Internet Explorer 11和Google Chrome中体验过这一点。 我用console.log测试了它(document.cookie);在开发人员工具中 - 它仅显示用于该特定页面加载的cookie的当前值。浏览器似乎持有相同名称 - 值对的多个版本。 使用以下javscript函数设置cookie名称 - 值对:
function SetCookie(c_name, value, exdays){
var domain = SiteDomainName();
var exdate = new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value = escape(value) + ((exdays==null) ? "" : "; expires=" + exdate.toUTCString() + ";path=/");
document.cookie = c_name + "=" + c_value;
}
我一直认为,一旦我们使用与现有c_name相同的c_name设置cookie,旧版本就会被覆盖。此外,我们的orderID cookie的值是使用.NET中的Guid.NewGuid()在服务器上生成的,因此在同一会话中创建重复项的可能性极小。我发现当我们为其位置使用不同的path = / {url_path}时,可能存在多个版本的同一个cookie,但这不是问题,因为cookie总是使用上面的函数设置,该函数总是使用“path = /“ - 我们域名的根源。我们还有一个重定向规则,以确保只有www。可以显示域的版本,我们没有子域。
我一直在试图理解为什么以及浏览器如何保留相同名称 - 值对cookie的多个版本。如果是这种情况 - 如何在javascript(或服务器上的.NET)中检测到这种情况,从而避免它?我的问题的另一个关键点是浏览器的后退按钮。我们似乎只能在单击它时重新创建此行为。刷新同一页面或跟随链接永远不会替换现有的cookie。更新:当我在JS中使用window.location.href = url将用户发送到另一个页面时,我们也注意到了这种行为。