5.4 Cookie对象
Session对象用于保存安全性较高的数据,如果有些数据不是特别重要(例如用户地址),这时再用Session保存会使服务器内存资源的占用量大,过多的存储会导致服务器内存资源耗尽。
ASP.NET中提供了多个内置对象,提到Session对象,就不得不提到另一个保存数据的对象,即Cookie对象。
5.4.1 Cookie对象概述
Cookie对象提供一种在Web应用程序中存储用户特定信息的方法。实际上,Cookie就是保存在客户机硬盘上的一个文件,它允许Web应用程序在用户的计算机上保存并取回信息,信息的片段以键/值对的形式存储。
1.写入Cookie
由于Cookie不是Page类的子类,因此,在使用方法中与Session和Application等对象有所不同。Cookie对象分别属于Request对象和Response对象,每一个Cookie变量都是被Cookies对象所管理,它的对象类型名称是HttpCookieCollection。
如果要写入或者存储一个Cookie变量,需要用Response对象的Cookies集合。使用方法如下。
Response.Cookies[Cookie的索引值].Value = "变量值"; Response.Cookies["Cookie的名称"].Value = "变量值";
调用Response.Cookies.Add()方法也可以将指定的Cookie添加到Cookie集合中,语法如下。
HttpCookie hcCookie = new HttpCookie("Cookie的名称", "值"); //第二种创建方法 Response.Cookies.Add(hcCookie);
2.读取Cookie
读取Cookie时需要借助于Request对象的Cookies集合,并将指定的Cookie传回,语法如下。
变量名 = Request.Cookies["Cookie的名称"].Value; 变量名 = Request.Cookies[Cookie的索引值].Value;
除了上述方法外,还可以通过Request.Cookies.GetKey()方法进行读取,语法如下。
string变量名 = Request.Cookies.GetKey(Cookie的索引值);
3.Cookie的注意事项
Cookie通常用于保存非敏感的用户信息,如居住地址、上次登录时间和上次登录IP地址等。开发者在使用Cookie时需要注意以下几点。
(1)并非所有的浏览器都提供对Cookie的支持。
(2)Cookie对象的有效时间默认为保存至用户关闭浏览器,这时Cookie对象将不会被保存至用户硬盘。
(3)Cookie对象数据信息是以明文文本的形式保存在客户端的计算机中,因此,不能保存敏感的、未加密的数据,以确保网站的安全性。
(4)Cookie对象存储数据量有限,大多数浏览器支持最大容量为4KB,因此,不能保存数据量大的数据。
4.Cookie与Session和Application的区别
Cookie与Session和Application对象很类似,也是一种集合对象,都用来保存数据。但是它们也存在着区别,如下从存储位置、生命周期、应用范围以及信息量大小等方面进行说明。
1)存储位置不同
这是Cookie与Session和Application对象的最大不同点。Cookie以档案的形式将数据存放在客户端的磁盘上,而Application和Session对象是将数据存放于服务器端。
2)生命周期不同
Cookie的生命周期可以一直存在,也可以终止于所设置的时间。Application对象的生命周期终止于IIS关闭时。Session对象的生命周期终止于设置的时间或使用者离线。
3)应用范围
Cookie和Session都适用于单个用户,而Application则适用于所有的用户,即整个应用程序。
4)信息量大小
Cookie通常用于存储小量的、简单的、对安全要求不严格的数据。Session保存小量的、简单的、比较安全的数据,但是它的效率不高。Application可用于保存任意大小的数据。
5.4.2 Cookie对象的属性
Cookie与Session和Application对象类似,都是用来保存相关数据信息。5.4.1节已经提到:Cookie和其他对象最大的不同在于存储位置,即Cookie将信息保存在客户端,Session和Application是保存在服务器端。也就是说,无论何时用户连接到服务器,Web应用程序都可以访问Cookie信息。这样,既方便用户的使用,也方便网站对用户的管理。
Cookie对象实际上是HttpCookie类的一个实例,每一个Cookie对象都属于Cookies集合。Cookie中包含一系列的属性,常用属性如表5-6所示。
表5-6 Cookie对象的常用属性
【范例9】
在创建的窗体页中添加Label控件,该控件用于显示Cookie中的内容。在窗体页面后台的Load事件中添加代码,首先增加两个Cookie对象,然后使用for循环将集合中的Cookie对象输出,代码如下。
protected void Page_Load(object sender, EventArgs e) { Response.Cookies["Cookie1"].Value = "Microsoft VisualStudio .NET"; Response.Cookies["Cookie2"].Value = "ASP.NET"; lblMessage.Text = "第一种方式:<br/>"; for (int i = 0; i < Request.Cookies.Count; i++) { lblMessage.Text += "变量名称:" + Request.Cookies[i].Name + ",变量 值:" + Request.Cookies[i].Value+"<br/>"; } lblMessage.Text += "第二种方式:<br/>"; for (int i = 0; i < Request.Cookies.Count; i++) { lblMessage.Text += "变量名称:" + Request.Cookies.GetKey(i) + ", 变量值:" + Request.Cookies.Get(i).Value+"<br/>"; } Response.Cookies.Clear(); }
在上述代码中,通过两种方法获取集合中的对象,除了Request.Cookies[i].Name和Request.Cookies.GetKey(i)可以获取对象名称外,还可以通过Request.Cookies.Get(i).Name获取对象名称。
运行本次范例的窗体页查看效果,如图5-9所示。
图5-9 读取Cookie对象的内容
在ASP.NET中Cookie有两种类型:会话Cookie(默认类型)和持久性Cookie。会话Cookie是临时性的,一旦会话状态结束它将不复存在;持久性Cookie具有指定的过期日期,过期之前Cookie在用户的计算机上以文本文件的形式存储。如果要设置Cookie的过期日期,可以通过Expire属性进行设置。如下代码设置Cookie1对象的过期日期。
Response.Cookies["Cookie1"].Expires = DateTime.Now.AddMinutes(1);