【摘录】asp.net Cookie操作

  Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法。例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息。当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息。

  使用 Cookie 能够达到多种目的,所有这些目的都是为了帮助网站记住用户。例如,一个实施民意测验的站点可以简单地将 Cookie 作为一个 Boolean 值,用它来指示用户的浏览器是否已参与了投票,这样用户便无法进行第二次投票。要求用户登录的站点则可以通过 Cookie 来记录用户已经登录,这样用户就不必每次都输入凭据。

  Cookie 的限制

  大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。

  浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。

  您可能遇到的 Cookie 限制是用户可以将其浏览器设置为拒绝接受 Cookie。如果定义一个 P3P 隐私策略,并将其放置在网站的根目录中,则更多的浏览器将接受您站点的 Cookie。但是,您可能会不得不完全放弃 Cookie,而通过其他机制来存储用户特定的信息。存储用户信息的常用方法是会话状态,但会话状态依赖于 Cookie,这一点在后面的“Cookie 和会话状态”一节中说明。

  虽然 Cookie 在应用程序中非常有用,但应用程序不应依赖于能够存储 Cookie。不要使用 Cookie 支持关键功能。如果应用程序必须依赖于 Cookie,则可以通过测试确定浏览器是否将接受 Cookie。请参见本主题后面的“检查浏览器是否接受 Cookie”一节。

  浏览器负责管理用户系统上的 Cookie。Cookie 通过

对象发送到浏览器,该对象公开称为 的集合。可以将 HttpResponse 对象作为 类的 属性来访问。要发送给浏览器的所有 Cookie 都必须添加到此集合中。创建 Cookie 时,需要指定 。每个 Cookie 必须有一个唯一的名称,以便以后从浏览器读取 Cookie 时可以识别它。由于 Cookie 按名称存储,因此用相同的名称命名两个 Cookie 会导致其中一个 Cookie 被覆盖。

  还可以设置 Cookie 的到期日期和时间。用户访问编写 Cookie 的站点时,浏览器将删除过期的 Cookie。只要应用程序认为 Cookie 值有效,就应将 Cookie 的有效期设置为这一段时间。对于永不过期的 Cookie,可将到期日期设置为从现在起 50 年。

  如果没有设置 Cookie 的有效期,仍会创建 Cookie,但不会将其存储在用户的硬盘上。而会将 Cookie 作为用户会话信息的一部分进行维护。当用户关闭浏览器时,Cookie 便会被丢弃。这种非永久性 Cookie 很适合用来保存只需短时间存储的信息,或者保存由于安全原因不应该写入客户端计算机上的磁盘的信息。例如,如果用户在使用一台公用计算机,而您不希望将 Cookie 写入该计算机的磁盘中,这时就可以使用非永久性 Cookie。

  可以通过多种方法将 Cookie 添加到 Cookies 集合中。下面的示例演示两种编写 Cookie 的方法:

  方法一: 

);

  方法二:  

);

  Response.Cookies.Add(aCookie);

  此示例向 Cookies 集合添加两个 Cookie,一个名为 userName,另一个名为 lastVisit
对于第一个 Cookie,Cookies 集合的值是直接设置的。可以通过这种方式向集合添加值,因
为 Cookies 是从 
 类型的专用集合派生的。对于第二个 Cookie,
代码创建了一个 
 类型的对象实例,设置其属性,然后通过 
 方法将其添加到 
Cookies 集合。在实例化 HttpCookie 对象时,必须将该 Cookie 的名称作为构造函数的一部
分进行传递。这两个示例都完成了同一任务,即向浏览器写入一个 Cookie。在这两种方法中,
有效期值必须为 
 类型。但是,lastVisited 值也是日期时间值。因为所有 Cookie 
值都存储为字符串,因此,必须将日期时间值转换为 
  

 多值 Cookie

 可以在 Cookie 中存储一个值,如用户名和上次访问时间。也可以在一个 Cookie 中存储多个
名称/值对。名称/值对称为子键。(子键布局类似于 URL 中的查询字符串。)例如,不要创建两
个名为 userNamelastVisit 的单独 Cookie,而可以创建一个名为 userInfo 的 Cookie,
其中包含两个子键 userNamelastVisit。您可能会出于多种原因来使用子键。首先,将相关
或类似的信息放在一个 Cookie 中很方便。此外,由于所有信息都在一个 Cookie 中,所以诸如
有效期之类的 Cookie 属性就适用于所有信息。(反之,如果要为不同类型的信息指定不同的到期
日期,就应该把信息存储在单独的 Cookie 中。)带有子键的 Cookie 还可帮助您限制 Cookie 
文件的大小。正如前面“Cookie 的限制”一节中所提到的,Cookie 通常限制为 4096 字节,并
且每个站点最多可存储 20 个 Cookie。使用带子键的单个 Cookie,使用的 Cookie 数就不会超
过分配给站点的 20 个的限制。此外,一个 Cookie 会占用大约 50 个字符的系统开销(用于保存
有效期信息等),再加上其中存储的值的长度,其总和接近 4096 字节的限制。如果存储五个子键
而不是五个单独的 Cookie,便可节省单独 Cookie 的系统开销,节省大约 200 字节。若要创建带
子键的 Cookie,您可以使用编写单个 Cookie 的各种语法。下面的示例演示用于编写同一 Cookie 
的两种方法,其中的每个 Cookie 都带有两个子键:
 方法一:

);

 方法二: 
   控制 Cookie 的范围
  默认情况下,一个站点的全部 Cookie 都一起存储在客户端上,而且所有 Cookie 都会
随着对该站点发送的任何请求一起发送到服务器。也就是说,一个站点中的每个页面都能获得
该站点的所有 Cookie。但是,可以通过两种方式设置 Cookie 的范围:
  • 将 Cookie 的范围限制到服务器上的某个文件夹,这允许您将 Cookie 限制到站点上的

某个应用程序。

  • 将范围设置为某个域,这允许您指定域中的哪些子域可以访问 Cookie。

    

  将 Cookie 限制到某个文件夹或应用程序

 若要将 Cookie 限制到服务器上的某个文件夹,请按下面的示例设置 Cookie 的

属性:

;

  Response.Cookies.Add(appCookie);

 路径可以是站点根目录下的物理路径,也可以是虚拟根目录。所产生的效果是 Cookie 只能
用于 Application1 文件夹或虚拟根目录中的页面。
例如,如果您的站点名称为 www.contoso.com,则在前面示例中创建的 Cookie 将只能用
于路径为 http://www.contoso.com/Application1/
的页面以及该文件夹下的所有页面。但是,Cookie 将不能用于其他应用程序中的页面,如 http
://www.contoso.com/Application2/ 或 http://www.contoso.com/ 中的页面。
  

  限制 Cookie 的域范围

  默认情况下,Cookie 与特定域关联。例如,如果您的站点是 www.contoso.com,那么当

用户向该站点请求任何页时,您编写的 Cookie 就会被发送到服务器。(这可能不包括带有特定

路径值的 Cookie。)如果站点具有子域(例如,contoso.com、sales.contoso.com 和 supp

ort.contoso.com),则可以将 Cookie 与特定的子域关联。若要执行此操作,请设置 Cookie

属性,如此示例所示:

  

;


当以此方式设置域时,Cookie 将仅可用于指定的子域中的页面。还可以使用 Domain 属性创
建可在多个子域间共享的 Cookie,如下面的示例所示:

随后 Cookie 将可用于主域,也可用于 sales.contoso.com 和 support.contoso.com 域。