Cookie

Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法。
当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息。当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息。
Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。
如果在用户请求站点中的页面时应用程序发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的 Cookie,用户的浏览器在获得页面的同时还获得了该 Cookie,并将它存储在用户硬盘上的某个文件夹中。
以后,如果该用户再次请求您站点中的页面,当该用户输入 URL 时,浏览器便会在本地硬盘上查找与该 URL 关联的 Cookie。如果该 Cookie 存在,浏览器便将该 Cookie 与页请求一起发送到您的站点。然后,应用程序便可以确定该用户上次访问站点的日期和时间。您可以使用这些信息向用户显示一条消息,也可以检查到期日期。
Cookie 的限制
大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。
浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。
编写 Cookie 的方法:

Response.Cookies["userName"].Value = "patrick";//设置cookie的值
Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1);//设置过期时间(1天后),如果不设置该属性则是将Cookie的数据存储到浏览器的内存中,如果浏览器关闭了,数据也没了.

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

1 Response.Cookies["userInfo"]["userName"] = "patrick";
2 Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
3 Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
4  
5 HttpCookie aCookie = new HttpCookie("userInfo");
6 aCookie.Values["userName"] = "patrick";
7 aCookie.Values["lastVisit"] = DateTime.Now.ToString();
8 aCookie.Expires = DateTime.Now.AddDays(1);
9 Response.Cookies.Add(aCookie);

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

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

读取 Cookie
浏览器向服务器发出请求时,会随请求一起发送该服务器的 Cookie。在 ASP.NET 应用程序中,可以使用 HttpRequest 对象读取 Cookie,该对象可用作 Page 类的 Request 属性使用。HttpRequest 对象的结构与 HttpResponse 对象的结构基本相同,因此,可以从 HttpRequest 对象中读取 Cookie,并且读取方式与将 Cookie 写入 HttpResponse 对象的方式基本相同。下面的代码示例演示两种方法,通过这两种方法可获取名为 username 的 Cookie 的值,并将其值显示在 Label 控件中:

//在尝试获取 Cookie 的值之前,应确保该 Cookie 存在;如果该 Cookie 不存在,将会收到 NullReferenceException 异常。还请注意在页面中显示 Cookie 的内容前,先调用 HtmlEncode 方法对 Cookie 的内容进行编码。这样可以确保恶意用户没有向 Cookie 中添加可执行脚本。
if(Request.Cookies["userName"] != null)
    Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);
 
if(Request.Cookies["userName"] != null)
{
    HttpCookie aCookie = Request.Cookies["userName"];
    Label1.Text = Server.HtmlEncode(aCookie.Value);
}

读取 Cookie 中子键值的方法与设置该值的方法类似。下面的代码示例演示获取子键值的一种方法:

if(Request.Cookies["userInfo"] != null)
{
    Label1.Text = 
        Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]);
 
    Label2.Text =
        Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]);
}

删除 Cookie
删除 Cookie(即从用户的硬盘中物理移除 Cookie)是修改 Cookie 的一种形式。由于 Cookie 在用户的计算机中,因此无法将其直接移除。但是,可以让浏览器来为您删除 Cookie。该技术是创建一个与要删除的 Cookie 同名的新 Cookie,并将该 Cookie 的到期日期设置为早于当前日期的某个日期。当浏览器检查 Cookie 的到期日期时,浏览器便会丢弃这个现已过期的 Cookie。下面的代码示例演示删除应用程序中所有可用 Cookie 的一种方法:

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

 

posted @ 2016-01-17 12:05  KotobukiTsumugi  阅读(127)  评论(0)    收藏  举报