【问题标题】:How do I create a persistent vs a non-persistent cookie?如何创建持久性与非持久性 cookie?
【发布时间】:2011-04-21 15:41:35
【问题描述】:

我似乎无法弄清楚如何创建持久性和非持久性 cookie。例如,它们在发回的 HTTP 标头方面有何不同?

【问题讨论】:

    标签: http cookies


    【解决方案1】:

    Cookie 有一个隐式或显式设置的过期日期,用于控制它们的持续时间(取决于用户代理实际执行的时间)。 cookie 可能仅在会话期间(或什至更短的时间)持续存在。

    如果 cookie 有效,它将与 HTTP 请求一起传递到它所源自的域。只有设置 cookie 的域才能读取 cookie(尽管有一些方法可以利用它,例如跨站点脚本)。

    • 如果您希望 cookie 在特定时间过期,请设置过期时间 使用您选择的客户端或服务器端语言在其上注明日期。

    • 如果您希望 cookie 在会话结束时过期,请不要设置 到期日期。

    From the RFC (emphasis mine):

    cookie 设置器可以指定一个 删除日期,在这种情况下 cookie 将在该日期被删除。

    如果 cookie 设置器没有指定 一个日期,cookie 被删除一次 用户退出他或她的浏览器。

    因此,指定日期是一种 让饼干生存下来 会议。 因此,cookie 有到期日期的被称为 持久。

    作为示例应用程序, 购物网站可以使用持久化 用于存储用户拥有的项目的 cookie 放在他们的篮子里。 (事实上​​, cookie 可能指的是 存储在购物网站的数据库, 不在您的计算机上。)这样,如果 用户退出浏览器 购买并稍后退货, 他们仍然在 篮子,所以他们不必寻找 这些项目再次。如果这些 cookie 没有给出到期日期, 当浏览器运行时,它们会过期 关闭,以及有关的信息 购物篮内容会丢失。

    【讨论】:

    • 如果我只希望 cookie 在会话中持续存在,我应该设置什么过期时间?
    • 谢谢!这是否意味着任何没有 expires 子句的 Set-Cookie 都将成为会话 cookie,并且一旦浏览器重新启动就会丢失?因为那不是我看到的......一旦我做了一个没有过期的 Set-Cookie,然后重新启动浏览器,我仍然可以读回那个 cookie。这是预期的吗?
    • 我仔细检查以确保并发布了一些额外的链接。您正在运行什么语言/网络服务器,您会看到这种行为?
    • 我终于知道发生了什么。在 Firefox 上,如果您打开会话恢复(“当 Firefox 启动时:显示我上次的窗口和选项卡”),它甚至会在您重新启动时恢复会话 cookie!见bugzilla.mozilla.org/show_bug.cgi?id=443354
    • 这是一个有趣的行为......一方面,这似乎是一个巨大的错误,另一方面,我可以看到为什么非技术用户会期望他们的会话继续进行。理论上,您可以通过查看 cookie 引用的会话是否仍然存在来针对该场景执行有限的检查,尽管我发现像这样的检查可能非常困难并且容易出错。更简单的方法是在每次查看页面时写入一个持久性 cookie,并检查自上次活动以来已经过去了多长时间。
    【解决方案2】:

    会话 cookie

    HttpCookie cookie = new HttpCookie("myCookieName", "myCookieValue");
    Response.Cookies.Add(cookie);
    

    带有特定时间戳的 Cookie (.NET DateTime library)

    HttpCookie cookie = new HttpCookie("myCookieName", "myCookieValue");
    cookie.Expires = DateTime.Today.AddMonths(12); //or AddMinutes, or AddHours...
    Response.Cookies.Add(cookie);
    

    持久性 Cookie

    HttpCookie cookie = new HttpCookie("myCookieName", "myCookieValue");
    cookie.Expires = DateTime.MaxValue;
    Response.Cookies.Add(cookie);
    

    【讨论】:

      【解决方案3】:

      在 ASP.NET 中有两种类型的 cookie

      持久性 cookie:

      Cookie 存储在您的计算机硬盘上。它们保留在您的硬盘上,并且可以被 Web 服务器访问,直到它们被删除或过期。

      public void SetPersistentCookies(string name, string value)
      {
          HttpCookie cookie = new HttpCookie(name);
      
          cookie.Value = value;
      
          cookie.Expires = Convert.ToDateTime(“12/12/2008″);
      
          Response.Cookies.Add(cookie);
      }
      

      非持久性 cookie:

      Cookie 仅在您的网络浏览器运行时保存。只有在您关闭浏览器之前,它们才能被 Web 服务器使用。它们没有保存在您的磁盘上。

      public void SetNonPersistentCookies(string name, string value)
      {
          HttpCookie cookie = new HttpCookie(name);
      
          cookie.Value = value;
      
          Response.Cookies.Add(cookie);
      }
      

      【讨论】:

        【解决方案4】:

        持久性 cookie 具有由网络发布的到期日期 服务器。基本上,这种类型的 cookie 保存在您的计算机上,因此 当您关闭它并再次启动它时,cookie 仍然存在。 一旦到达到期日期,它就会被所有者销毁。

        参考:https://www.cookiepro.com/knowledge/what-is-a-persistent-cookie/

        如果 cookie 不包含过期日期,则将其视为会话/非持久性 cookie。

        因此,基本上持久性 cookie 带有 expires 属性,例如

        expires="Wdy, DD-Mon-YYYY HH:MM:SS GMT"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-24
          • 2011-03-09
          • 2010-12-21
          • 2016-11-04
          • 2017-07-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多