【问题标题】:Chrome losing cookiesChrome 丢失 cookie
【发布时间】:2013-09-07 15:17:34
【问题描述】:

我在我的实时网站上遇到了一个错误,我在我的开发环境中看不到它,它似乎只发生在 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
  • RawSize = 230b
  • 路径 = /
  • 过期 = 会话
  • HttpOnly = HttpOnly
  • 值 = 加密

当用户与网站交互时,似乎正在创建购物车 Cookie,但它会不时丢失或丢弃。当我查看 Elmah 错误并查看 HTTP_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

【问题讨论】:

  • Cookie 仅用于会话,您是否正在重定向到另一个站点或服务来处理付款?如果是这样,会话将失效,因此 cookie 消失了....
  • 我没有重定向,但我在 iFrame 中托管了一个支付门户,它回调到该站点。但是为什么我的其他会话 cookie 能够存活而这个却没有呢?
  • 你的其他 cookie 有多大?,在 chrome 上,我认为总大小只能是 4k。 stackoverflow.com/q/2543851/15710。我不确定 cookie 是存储用户购物车的最佳方式,ASP.Net 有其他方法,例如 Session。
  • 不是 cookie 的大小,加起来我所有的 cookie 都不到 1k。我注意到 Chrome 有时会制作两个会话 cookie。每个都有不同的域(我不是通过可能是问题的代码设置域)。一个域名为 www.mysite.com,另一个域名为 .mysite.com。问题可能出在我的 cookie 域值上吗?
  • 是的,听起来很像

标签: asp.net-mvc google-chrome cookies


【解决方案1】:

让我给你一个解决方案。我已经使用 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");

【讨论】:

    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2011-07-20
    • 2018-03-12
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多