【问题标题】:How to delete cookies on an ASP.NET website如何删除 ASP.NET 网站上的 cookie
【发布时间】:2011-10-01 21:31:28
【问题描述】:

在我的网站中,当用户单击“注销”按钮时,Logout.aspx 页面会加载代码Session.Clear()

在 ASP.NET/C# 中,这会清除所有 cookie 吗?或者是否需要添加任何其他代码来删除我网站的所有 cookie?

【问题讨论】:

    标签: c# asp.net session cookies session-cookies


    【解决方案1】:

    试试这样的:

    if (Request.Cookies["userId"] != null)
    {
        Response.Cookies["userId"].Expires = DateTime.Now.AddDays(-1);   
    }
    

    但是用起来也有意义

    Session.Abandon();
    

    除了在许多情况下。

    【讨论】:

    • Session.Abandon 将清除 ASP.NET 会话 cookie,但不会清除您手动设置的 cookie,例如此处的 userID。 Cookies["whatever"] 永远不会为空;如果您要求一个不存在的 cookie,框架将创建一个 cookie。
    • @Andomar,实际上Cookies["whatever"]在cookie不存在时返回null!我知道这是一条旧评论,但我不希望其他读者被这条评论误导。
    • Expires 未设置为 DateTime.MinValue 也很重要,因为这实际上会给 cookie 一个会话过期时间,这意味着它会等到浏览器/选项卡(取决于浏览器)关闭之前删除 cookie。
    • @NunoAgapito 非常旧,但对于其他用户,如果您从“请求”读取 Cookies["whatever"],则返回 null,如果您从“响应”读取,则返回空 cookie。
    • 但这只会从cookie中删除内容,至少对我来说cookie仍然保留在浏览器中
    【解决方案2】:

    不可以,Cookie 只能由setting the Expiry date 为每个人清除。

    if (Request.Cookies["UserSettings"] != null)
    {
        HttpCookie myCookie = new HttpCookie("UserSettings");
        myCookie.Expires = DateTime.Now.AddDays(-1d);
        Response.Cookies.Add(myCookie);
    }
    

    此刻Session.Clear()

    • Session 集合中的所有键值对都被删除。 Session_End 事件没有发生。

    如果在注销时使用此方法,还应使用Session.Abandon 方法 Session_End事件:

    • 带有会话 ID 的 Cookie(如果您的应用程序使用 cookie 存储会话 ID,这是默认设置)

    【讨论】:

    • 正确的到期日期,但我相信if 行实际上不起作用。当您使用 Cookies["whatever"] 请求 cookie 时,如果它不存在,框架将创建一个 cookie。
    • @Andomar 这是我从 MSDN 获得的代码。我认为如果我们调用 Request 对象,它不会创建一个 cookie。
    • 啊哈,看起来它只为Response 对象创建了一个cookie。有趣:)
    • 这段代码只需一行Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1)即可优化。此处服务器将请求浏览器删除 cookie。如果存在,浏览器将删除它。
    • 是的,对我来说,我需要 Response.Cookies.Add(myCookie) 部分 - 没有它,它不会总是/正确地工作。谢谢。
    【解决方案3】:

    这是我用的:

        private void ExpireAllCookies()
        {
            if (HttpContext.Current != null)
            {
                int cookieCount = HttpContext.Current.Request.Cookies.Count;
                for (var i = 0; i < cookieCount; i++)
                {
                    var cookie = HttpContext.Current.Request.Cookies[i];
                    if (cookie != null)
                    {
                        var expiredCookie = new HttpCookie(cookie.Name) {
                            Expires = DateTime.Now.AddDays(-1),
                            Domain = cookie.Domain
                        };
                        HttpContext.Current.Response.Cookies.Add(expiredCookie); // overwrite it
                    }
                }
    
                // clear cookies server side
                HttpContext.Current.Request.Cookies.Clear();
            }
        }
    

    【讨论】:

    • 非常感谢!也解决了我的 cookie 不会更新服务器端的问题
    【解决方案4】:

    不幸的是,对我来说,设置“过期”并不总是有效。 cookie 不受影响。

    这段代码对我有用:

    HttpContext.Current.Session.Abandon();
    HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
    

    其中"ASP.NET_SessionId" 是cookie 的名称。这并没有真正删除 cookie,而是用一个空白 cookie 覆盖它,这对我来说已经足够接近了。

    【讨论】:

      【解决方案5】:

      我只想指出,正如其他人所说,使用 Session.Abandon 时不会删除 Session ID cookie。

      当您放弃会话时,会话 ID cookie 不会从 用户的浏览器。因此,会议一结束 放弃,对同一应用程序的任何新请求都将使用相同的 会话 ID,但会有一个新的会话状态实例。同时 时间,如果用户在同一个 DNS 中打开另一个应用程序 域,用户在 Abandon 后不会丢失会话状态 从一个应用程序调用方法。

      有时,您可能不想重复使用会话 ID。如果你这样做并且如果 您了解不重用会话 ID 的后果,请使用 以下代码示例放弃会话并清除 会话 ID cookie:

      Session.Abandon();
      Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
      

      此代码示例从服务器清除会话状态并设置 会话状态 cookie 为空。空值有效清除 来自浏览器的 cookie。

      http://support.microsoft.com/kb/899918

      【讨论】:

        【解决方案6】:

        现在是 2018 年,所以在 ASP.NET Core 中,有一个直截了当的内置函数。要删除 cookie,请尝试以下代码:

        if(Request.Cookies["aa"] != null)
        {
            Response.Cookies.Delete("aa");
        }
        return View();
        

        【讨论】:

          【解决方案7】:

          您永远不应将密码存储为 cookie。要删除 cookie,您实际上只需要修改并使其过期。您不能真正删除它,即将它从用户的磁盘中删除。

          这是一个示例:

          HttpCookie aCookie;
              string cookieName;
              int limit = Request.Cookies.Count;
              for (int i=0; i<limit; i++)
              {
                  cookieName = Request.Cookies[i].Name;
                  aCookie = new HttpCookie(cookieName);
                  aCookie.Expires = DateTime.Now.AddDays(-1); // make it expire yesterday
                  Response.Cookies.Add(aCookie); // overwrite it
              }
          

          【讨论】:

            【解决方案8】:

            以OP的问题标题为删除所有cookie-“删除网站中的cookie”

            我在网上某个地方看到了 Dave Domagala 的代码。我编辑了 Dave's 以允许谷歌分析 cookie - 它遍历网站上找到的所有 cookie 并将它们全部删除。 (从开发人员的角度来看 - 将新代码更新到现有网站中,是避免用户重新访问该网站时出现问题的好方法。

            我使用下面的代码首先读取 cookie,保存任何所需的数据 - 然后在使用下面的循环清洗所有内容后重置 cookie。

            代码:

            int limit = Request.Cookies.Count; //Get the number of cookies and 
                                               //use that as the limit.
            HttpCookie aCookie;   //Instantiate a cookie placeholder
            string cookieName;   
            
            //Loop through the cookies
            for(int i = 0; i < limit; i++)
            {
             cookieName = Request.Cookies[i].Name;    //get the name of the current cookie
             aCookie = new HttpCookie(cookieName);    //create a new cookie with the same
                                                      // name as the one you're deleting
             aCookie.Value = "";    //set a blank value to the cookie 
             aCookie.Expires = DateTime.Now.AddDays(-1);    //Setting the expiration date
                                                            //in the past deletes the cookie
            
             Response.Cookies.Add(aCookie);    //Set the cookie to delete it.
            }
            

            补充:如果您使用 Google Analytics

            上述循环/删除将删除该站点的所有 cookie,因此如果您使用 Google Analytics - 保留 __utmz cookie 可能会很有用,因为该 cookie 会跟踪访问者的来源、搜索引擎是什么使用的链接、点击的链接、使用的关键字以及访问您的网站时它们在世界上的哪个位置。

            因此,为了保留它,一旦知道 cookie 名称,就包装一个简单的 if 语句:

            ... 
            aCookie = new HttpCookie(cookieName);    
            if (aCookie.Name != "__utmz")
            {
                aCookie.Value = "";    //set a blank value to the cookie 
                aCookie.Expires = DateTime.Now.AddDays(-1);   
            
                HttpContext.Current.Response.Cookies.Add(aCookie);    
            }
            

            【讨论】:

              【解决方案9】:

              虽然这是一个旧线程,但我想如果有人仍在寻找未来的解决方案。

              HttpCookie mycookie = new HttpCookie("aa");
              mycookie.Expires = DateTime.Now.AddDays(-1d);
              Response.Cookies.Add(mycookie1);
              

              这就是我的诀窍。

              【讨论】:

                【解决方案10】:

                Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1)

                【讨论】:

                  【解决方案11】:

                  您必须设置过期日期才能删除 cookie

                  Request.Cookies[yourCookie]?.Expires.Equals(DateTime.Now.AddYears(-1));
                  

                  如果 cookie 不存在,这不会引发异常。

                  【讨论】:

                    【解决方案12】:

                    如果有人喜欢,我强烈更喜欢这个。

                    string COOKIE_NAME = "COOCKIE NAME"
                    
                    if (HttpContext.Request.Cookies.AllKeys.Contains(COOKIE_NAME))
                            {
                                HttpCookie Cookie = HttpContext.Request.Cookies[COOKIE_NAME];
                                engagementIdCookie.Expires = DateTime.Now.AddDays(-1);
                                Response.Cookies.Add(Cookie);
                            }
                    

                    【讨论】:

                      猜你喜欢
                      • 2010-11-26
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-12-21
                      • 1970-01-01
                      • 2011-01-19
                      • 2016-05-27
                      • 1970-01-01
                      相关资源
                      最近更新 更多