ASP.NET中Cookie编程的基础知识(3)
2024-07-10 13:01:55
供稿:网友
查看您的 cookie
您可能会发现,了解创建 cookie 的效果会对您很有帮助。而查看 cookie 是比较容易的,因为它们都是文本文件,关键在于您能找到它们。不同的浏览器保存 cookie 的方式也不同。我将介绍 internet explorer 是如何保存 cookie 的。如果您使用的是其他浏览器,请查看该浏览器的帮助,以了解有关 cookie 处理方面的知识。
查看 cookie 的一个简便方法是让 internet explorer 为您查找。在 internet explorer 中,从“工具”菜单中选择“internet 选项”,在“常规”选项卡中单击“设置”,然后单击“查看文件”。internet explorer 将打开一个窗口,显示所有的临时文件,包括 cookie。在窗口中查找以“cookie:”开头的文件 或查找文本文件。双击一个 cookie,在默认的文本文件中打开它。
您也可以在硬盘上查找 cookie 的文本文件,从而打开 cookie。internet explorer 将站点的 cookie 保存在文件名格式为 <user>@<domain>.txt 的文件中,其中 <user> 是您的帐户名。例如,如果您的名称为 mikepope,您访问的站点为 www.contoso.com,那么该站点的 cookie 将保存在名为 [email protected] 的文件中。(该文件名可能包含一个顺序的编号,如 [email protected][1].txt。)
这个 cookie 文本文件是与用户相关的,所以会按照帐户分别保存。例如,在 windows xp 中,您可以在如下所示的目录中找到 cookie 文件:
c:/documents and settings/<user>/cookies
要查找最新创建的 cookie,可以按修改日期对目录内容进行排序,并查找最近修改的文件。
您可以使用文本编辑器打开 cookie。如果该文件包含多个 cookie,这些 cookie 之间将用星号 (*) 分隔。每个 cookie 的第一行是 cookie 的名称,第二行是值,其余各行则包含 cookie 的日常处理信息,例如过期日期和时间。cookie 中还有一个简单的校验和,如果更改 cookie 名称或值的长度,浏览器就会检测到修改并删除该 cookie。
多值 cookie(子键)
以上示例为每个要保存的值(用户名、上次访问时间)都使用了一个 cookie 。您也可以在一个 cookie 中保存多个名称/值对。名称/值对也称作“键”或“子键”,具体取决于您读取的内容。(如果您熟悉 url 的结构,就会发现子键与其中的查询字符串非常相象。) 例如,如果不希望创建名为“username”和“lastvisit”的两个单独的 cookie,可以创建一个名为“userinfo”的 cookie,并使其包含两个子键:“username”和“lastvisit”。
有很多原因会让我们用子键来代替单独的 cookie。最显而易见的是,把相关或类似的信息放在一个 cookie 中会比较有条理。另外,由于所有信息都在一个 cookie 中,所以诸如有效期之类的 cookie 属性就适用于所有信息。(当然,如果要为不同类型的信息指定不同的过期日期,就应该把信息保存在单独的 cookie 中。)
带有子键的 cookie 还可以帮助您减小 cookie 的大小。如前面的 cookie 的限制一节所述,cookie 的总大小限制在 4096 字节以内,而且不能为一个网站保存超过 20 个 cookie。利用带子键的单个 cookie,站点的 cookie 数量就不会超过 20 个的限制。此外,一个 cookie 会占用大约 50 个字符的基本空间开销(用于保存有效期信息等),再加上其中保存的值的长度,其总和接近 4k 的限制。如果使用五个子键而不是五个单独的 cookie,您可以省去四个 cookie 的基本空间开销,总共能节省大约 200 个字节。
要创建带子键的 cookie,您可以使用用于编写单个 cookie 的各种语法。以下示例显示了编写同一 cookie 的两种不同方法,其中的每个 cookie 都带有两个子键:
response.cookies("userinfo")("username") = "mike"
response.cookies("userinfo")("lastvisit") = datetime.now.tostring
response.cookies("userinfo").expires = datetime.now.adddays(1)
dim acookie as new httpcookie("userinfo")
acookie.values("username") = "mike"
acookie.values("lastvisit") = datetime.now.tostring
acookie.expires = datetime.now.adddays(1)
response.cookies.add(acookie)
控制 cookie 有效范围
默认情况下,一个站点的全部 cookie 都一起保存在客户机上,而且所有这些 cookie 都会随着对该站点发送的请求一起发送到服务器,也就是说,站点的每个页面都能得到该站点的所有 cookie。但有时候,您可能希望 cookie 更具有针对性,这时,您可以通过两种方法设置 cookie 的有效范围:
把 cookie 的有效范围限制在服务器上的一个文件夹中,实际上这样就将 cookie 限制到站点上的某个应用程序。
把有效范围设置为某个域,从而允许您指定域中的哪些子域可以访问 cookie。
将 cookie 限制到某个文件夹或应用程序
要将 cookie 限制到服务器上的某个文件夹,请按如下方法设置 cookie 的 path 属性:
dim appcookie as new httpcookie("appcookie")
appcookie.value = "written " & now.tostring
appcookie.expires = now.adddays(1)
appcookie.path = "/application1"
response.cookies.add(appcookie)
当然,您也可以通过直接设置 response.cookies 来编写 cookie,如前文所述。
路径可以是站点根目录下的物理路径,也可以是虚拟根目录。这样一来,cookie 就只能用于 application1 文件夹或虚拟根目录中的页面。例如,如果您的站点名为 www.contoso.com,则前面示例中生成的 cookie 就只能用于路径为 http://www.contoso.com/application1/ 的页面以及该文件夹下的所有页面,而不适用于其他应用程序中的页面,如 http://www.contoso.com/application2/ 或 http://www.contoso.com/ 下的页面。
提示:通过对 internet explorer 和 mozilla 浏览器进行测试发现,此处使用的路径是区分大小写的。一般而言,windows 服务器上的 url 不区分大小写,但这种情况例外。您无法控制用户如何在浏览器中输入 url,但是,如果您的应用程序依赖于与特定路径相关的 cookie,则请确保您所创建的所有超链接中的 url 与 path 属性值的大小写相匹配。
将 cookie 的有效范围限制到域
默认情况下,cookie 与特定的域相关联。例如,如果您的站点是 www.contoso.com,那么当用户向该站点请求页面时,您编写的 cookie 就被发送到服务器。(有特定路径值的 cookie 除外,我在上一节刚刚解释过。) 如果您的站点有子域(例如 contoso.com、sales.contoso.com 和 support.contoso.com),就可以把 cookie 同特定的子域相关联。为此,需要设置 cookie 的 domain 属性,如下所示:
response.cookies("domain").value = datetime.now.tostring
response.cookies("domain").expires = datetime.now.adddays(1)
response.cookies("domain").domain = "support.contoso.com"
如果按照这种方式设置域,则 cookie 只能用于指定子域中的页面。
您也可以利用 domain 属性来创建可在多个子域中共享的 cookie。例如,对域进行如下设置:
response.cookies("domain").value = datetime.now.tostring
response.cookies("domain").expires = datetime.now.adddays(1)
response.cookies("domain").domain = "contoso.com"
这样,该 cookie 就可用于主域、sales.contoso.com 和 support.contoso.com。