Chrome丢失Cookies

5

我在我的生产环境中遇到一个错误,但是在开发环境中并没有出现,而且似乎只有Chrome浏览器会出现这个问题。我已经找了一些解决方案,但是发现只有Auth cookie会引起问题(事实上,我之前就曾提出关于Chrome和Auth cookie的问题),但这次不同。

我把用户的购物车信息存储在cookie中。设置cookie的代码如下:

HttpCookie responseCookie = HttpContext.Response.Cookies[CartHelper.CART];
responseCookie.PackCartCookie(vm.Cart);

在扩展方法PackCartCookie中,如下设置cookie值

cookie.Value = HttpUtility.UrlEncode(cookieValue);

这导致一个 cookie 被存储,具有以下设置:
  • 域名 = www.foo.com
  • 原始大小 = 230b
  • 路径 = /
  • 过期时间 = Session
  • HttpOnly = HttpOnly
  • 值 = 加密
当用户与网站交互时,似乎会创建购物车 cookie,但有时会丢失或丢弃。当我查看 Elmah 错误并检查 HTTP_COOKIE 时,可以看到所有其他 cookie(我以相同方式设置的其他 cookie 正常运行),但我没有看到购物车 cookie。
由于这个问题,我不得不改变代码以更加防御。但是,正如您所想象的那样,购物车 cookie 在整个购买过程中都被使用,我在响应购买时遇到失败,因为购物车消失了,用户没有收到成功购买的通知。幸运的是,我及时发现了这个问题,并退还了受影响的用户。
我看到问题的用户代理:
  • Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36
  • Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
  • Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36

1
你的其他 cookie 大小是多少?在 Chrome 上,我认为总大小只能为 4k。https://dev59.com/jHE85IYBdhLWcg3w64IA。我不确定 cookie 是否是存储用户购物车的最佳方式,ASP.Net 还有其他方法,例如 Session。 - Mesh
不是cookie大小的问题,即使把我所有的cookie组合起来也不到1k。我注意到Chrome有时会创建两个会话cookie,每个cookie都有不同的域名(我没有通过代码设置域名,这可能是问题所在)。一个带有域名www.mysite.com,另一个只有.mysite.com。问题可能出在我的cookie域值上吗? - KevDevMan
你没有安装 Chrome 的 Cookie Monster 扩展吗? - Bronumski
希望你正在调用一个响应。Cookies。在代码中的某个地方添加... - Saravanan
iFrames 包含不同的域和窗口对象,因此认证 cookie 将不会传递到 iFrame。 - tzengia
显示剩余3条评论
1个回答

2
让我给你一个解决方案。我已经使用了cookie来存储大部分的值,并且在所有浏览器中都非常有效,并且可以存储指定的时间。为此,我使用了静态类,以便随处可访问。
我还进行了编码和解码。但是,您可以通过删除编码和解码并传递正常值来存储此内容。这是我的代码。
这里我放置了我的具有静态方法的类。我使用了带有机器密钥加密的HttpSecureCode进行编码和解码。在这种情况下,默认情况下可能不可用。您可以直接放置该值。
如果您非常关注使用HttpSecureCode,请使用link来构建您的类。
public class CookieStore
{
    public static void SetCookie(string key, string value, TimeSpan expires)
    {
        HttpCookie encodedCookie = HttpSecureCookie.Encode(new HttpCookie(key, value));

        if (HttpContext.Current.Request.Cookies[key] != null)
        {
            var cookieOld = HttpContext.Current.Request.Cookies[key];
            cookieOld.Expires = DateTime.Now.Add(expires);
            cookieOld.Value = encodedCookie.Value;
            HttpContext.Current.Response.Cookies.Add(cookieOld);
        }
        else
        {
            encodedCookie.Expires = DateTime.Now.Add(expires);
            HttpContext.Current.Response.Cookies.Add(encodedCookie);
        }
     }
    public static string GetCookie(string key)
    {
        string value = string.Empty;
        HttpCookie cookie = HttpContext.Current.Request.Cookies[key];

        if (cookie != null)
        {
            // For security purpose, we need to encrypt the value.
            HttpCookie decodedCookie = HttpSecureCookie.Decode(cookie);
            value = decodedCookie.Value;
        }
        return value;
    }

}

使用这些方法,您可以轻松地将值存储在cookie中,并在需要时获取值。
使用这些方法就像这样简单:
设置Cookie的代码如下:
CookieStore.SetCookie("currency", "GBP", TimeSpan.FromDays(1)); // here 1 is no of days for cookie to live

获取Cookie:
string currency= CookieStore.GetCookie("currency");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接