【问题标题】:Remove cookie by expiring it not working通过过期来删除 cookie 不起作用
【发布时间】:2016-07-28 04:09:33
【问题描述】:

我有一个添加到响应中的 cookie,但如果已经存在具有相同密钥的 cookie,我想将其删除,否则我最终会得到 2 个相同密钥的 cookie。

我以为只要让 cookie 过期,它就会从浏览器中删除?

HttpCookie cookie = new HttpCookie("UserCookie");
cookie.Value = encTicket;

if (HttpContext.Current.Request.Cookies["UserCookie"] != null)
    ClearCookie("UserCookie");

HttpContext.Current.Response.Cookies.Add(cookie);


private static void ClearCookie(string key)
{
    var httpContext = new HttpContextWrapper(HttpContext.Current);
    var _response = httpContext.Response;

    HttpCookie cookie = new HttpCookie(key)
    {
        Expires = DateTime.Now.AddMonths(-1),
        Value = null
    };

    _response.Cookies.Add(cookie);
}

非常感谢任何帮助。

【问题讨论】:

  • 事实上,添加一个过期的 cookie 会创建另一个,所以我最终得到了三个,原始的,过期的,我添加的和新的。

标签: asp.net-mvc asp.net-mvc-3 cookies setcookie


【解决方案1】:

“您不能直接删除用户计算机上的 cookie。但是,您可以通过将 cookie 的到期日期设置为过去的日期来指示用户的浏览器删除 cookie。下次用户向其中的页面发出请求时设置 cookie 的域或路径,浏览器会判断 cookie 已过期并删除。”

请阅读以下文章了解更多详情。

http://msdn.microsoft.com/en-us/library/ms178195(v=vs.85).aspx

【讨论】:

  • 我遇到的问题是我更改了 cookie 值,然后在返回浏览器之前尝试使用它,所以我总是有 2 个。如果这是选择最新的就足够了。
【解决方案2】:

这是我编写 cookie 的方式。

protected string CookieSession(Enums.CookieSessionTypes sessionTypes, string cookieValue = "")
    {
        string sessionId = string.Empty;

        var cookie = new HttpCookie(CookieName);

        switch (sessionTypes)
        {
            case Enums.CookieSessionTypes.Add:

                cookie.Values[SessionIdConst] = cookieValue;
                cookie.Expires = DateTime.Now.AddDays(1);
                Response.Cookies.Add(cookie);
                sessionId = cookieValue;

                break;
            case Enums.CookieSessionTypes.Delete:
                cookie.Values[SessionIdConst] = cookieValue;
                cookie.Expires = DateTime.Now.AddDays(-1);
                Response.Cookies.Add(cookie);

                break;
        }


        return sessionId;
    }

试一试,应该可以的

【讨论】:

  • 谢谢 filix,但我也有同样的问题。请参阅上一篇文章中的 cmets。
【解决方案3】:

现在我只是选择集合中的最后一个 cookie 值,尽管我意识到这是一个巨大的 hack。任何更好的建议都非常欢迎。

string value = "";
for (int i = 0; i < HttpContext.Current.Request.Cookies.Count; i++)
{
    if (HttpContext.Current.Request.Cookies[i].Name == "UserCookie")
    value = HttpContext.Current.Request.Cookies[i].Value;
}

【讨论】:

    【解决方案4】:

    我的 cookie 没有正确过期,因为它设置的路径与实际路径不同,并且与 URL 的域名部分不同,cookie 路径区分大小写。解决此问题的唯一方法是在您的 Web 服务器或代码中设置一种机制,以从任何其他 URL 大小写重定向到区分大小写的规范 URL。然后您的 cookie 将重新开始工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多