清华电脑学堂:ASP.NET 4.5网站开发与应用实践教程
上QQ阅读APP看书,第一时间看更新

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);