5.2 Session对象
Session对象是HttpSessionState类的一个实例,该类为当前用户会话提供信息,还提供对可用于存储信息的会话范围的缓存的访问,以及控制如何管理会话的方法。本节简单介绍Session对象的属性、方法以及使用。
5.2.1 Session对象概述
Session对象的功能和Application对象类似,都是用来存储跨网页程序的变量或者对象,但是Session对象和Application对象变量有些特性不太一样。各个联机的机器有各自的Session对象变量,不同的联机无法互相存取。
Application对象变量的生命周期终止于停止IIS服务,但是Session对象变量终止于联机机器离线,也就是当网页使用者关掉浏览器或超过设置Session变量对象的有效时间时,Session对象变量就会消失。
使用Session对象存储特定用户会话所需的信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户第一次请求指定的应用程序中的“.aspx”文件时,ASP.NET将生成一个SessionID,它是由一个复杂算法生成的号码,它唯一标识每个用户会话。在新会话开始时,服务器将SessionID作为一个Cookie存储在用户的Web浏览器中。
在将SessionID存储于用户的浏览器之后,即使用户请求了另一个“.aspx”文件,或请求了运行在另一个应用程序中的“.aspx”文件,ASP.NET仍会重用这个Cookie跟踪会话。与此相似,如果用户故意放弃会话或让会话超时,然后再请求另一个“.aspx”文件,那么ASP.NET将以同一个Cookie开始新的会话。只有当服务器管理员重新启动服务器,或用户重新启动Web浏览器时,存储在内存中的SessionID设置才被清除,用户将会获得新的SessionID。
5.2.2 Session对象的属性
Session对象和Application对象都是属于Page对象的成员,因此,可以直接使用。Session对象的使用方式和Application类似,语法如下。
Session["变量名"] = "内容";
对于每个用户的每次访问,Session对象都是唯一的,可以通过Session对象在页面间共享信息。只要Session没有超时,或者Abandon()方法没有被调用,Session中的信息就不会丢失。Session对象不能在用户间共享信息,而Application对象可以在不同的用户间共享信息。
Session对象提供了多个属性,通过这些属性可以设置会话超时的时间,查看当前会话状态模式和唯一标识符等,常用属性如表5-4所示。
表5-4 Session对象的常用属性
【范例6】
调用表5-4中的Mode属性、SessionID属性和Count属性获取会话模式、当前会话SessionID和会话集合中的项数,代码如下。
Response.Write("当前会话模式:" + Session.Mode + "<br/>"); Response.Write("当前会话SessionID:" + Session.SessionID + "<br/>"); Response.Write("会话集合中的项数:" + Session.Count + "<br/>"); Response.Write("会话有效时间:" + Session.Timeout);
5.2.3 Session对象的方法
Session对象提供了一系列操作会话的方法,通过这些方法可以添加新会话,也可以删除指定的会话。如表5-5所示对Session对象的常用方法进行说明。
表5-5 Session对象的常用方法
1.Add()方法
Session对象的Add()方法表示向会话状态集合中添加一个新项,语法如下。
void HttpSessionState.Add(string name, object value);
其中,name表示要添加到会话状态集合的项的名称;value表示要添加到会话状态集合的项的值。
【范例7】
分别通过Add()方法和赋值的方式向会话中添加对象,然后通过Session.Count输出集合中的对象数,代码如下。
Session.Add("loginPass", "234523"); Session["tranPass"] = "909873"; Response.Write("会话集合中的对象数:" + Session.Count);
2.CopyTo()方法
CopyTo()方法是指将会话状态值的集合复制到一维数组中(从数组的指定索引处开始),语法如下。
void HttpSessionState.CopyTo(Array array, int index)
其中,array是一个数组,它接收会话值;index指定array中从零开始的索引,在此处开始复制。
【范例8】
首先通过Session存储多个对象,接着声明strArray一维数组,并遍历数组中的值。然后调用CopyTo()方法将会话状态值复制到数组,最后遍历strArray数组中的元素,代码如下。
Session["pass1"] = "666666"; //为session变量赋值 Session["pass2"] = "888888"; Session["pass3"] = "556985"; String[] strArray = new String[] { "1", "2", "3", "4" }; //建立字符串数组 Response.Write("原数组如下:</br>"); foreach (String str in strArray) { //数组遍历 Response.Write(str + "</br>"); } Session.CopyTo(strArray, 0); //将session会话状态值复制到数组 Response.Write("新数组如下:</br>"); foreach (string str in strArray) { Response.Write(str + "</br>"); }
提示
Global.asax文件提供的7个事件中,Session_Start和Session_End事件与Session对象有关。Session_Start创建一个会话,在Session对象创建时触发。Session_End结束一个会话,在Session对象销毁时触发。