当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

6.7Session对象

8/31/2020 9:52:39 PM 人评论

6.7Session对象

6.7 Session对象

Session对象派生自HttpSessionState类,用来存储跨网页程序的变量或对象。Session对象只针对单一的用户,即各个连接的客户端有各自的Session对象变量,而不能被其他用户共享。

6.7.1 Session对象的属性和方法

在ASP.NET 4.5中,Session是一个内置对象的,该对象是Page类的子类,该类为当前用户会话提供信息,还提供对可用于存储信息的会话范围的缓存的访问,以及控制如何管理会话的方法。

可以使用Session对象存储特定用户会话所需的信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当会话过期或被放弃后,服务器将中止该会话。

利用Session进行状态管理是一个ASP.NET 4.5的显著特点。它允许程序员把任何类型的数据存储在服务器上。数据信息是受到保护的,因为它永远不会传送给客户端,它捆绑到一个特定的Session。每一个向应用程序发出请求的客户端则有不同的Session和一个独特的信息集合来管理(当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象)。Session是理想的信息存储器,比如当用户从一个页面跳转到另一个页面时,可以在它里面存储购物篮的内容。

ASP.NET采用一个具有120位的标识符来跟踪每一个Session。ASP.NET中利用专有算法来生成这个标识符的值,从而保证了(统计上的)这个值是独一无二的,它有足够的随机性,从而保证恶意的用户不能利用逆向工程或“猜”获得某个客户端的标识符的值。这个特殊的标识符被称为SessionID。

对于每个用户的每次访问,Session对象是唯一的,具体包含两个含义:

● 对于某个用户的某次访问,Session对象在访问期间是唯一,可以通过Session对象在页面间共享信息。只要Session没有超时,或者Abandon方法没有被调用,Session中的信息就不会丢失。

● 对于用户的每次访问而言,每次产生的Session都不同,所以不能共享数据,而且Session对象是有时间限制的,通过TimeOut属性可以设置Session对象的超时时间,单位为分钟。如果在规定的时间内,用户没有对网站进行任何的操作,Session将超时。

为系统能够正常工作,客户端必须为每个请求保存相应的SessionID,获取某个请求的SessionID的方式有两种:

● 使用Cookies。在这种情况下,当Session集合被使用时,SessionID被ASP.NET自动转化为一个特定的Cookie(被命名为ASP.NET_SessionID)。

● 使用改装的URL。在这种情况下,SessionID被转化为一个特定的改装的URL。ASP.NET的这个特性可以让程序员在客户端禁用Cookies时创建Session。

但是使用Session并不是免费的,虽然它解决了许多相关的问题,同其他形式的状态管理相比,它迫使服务器存储额外的信息。这笔额外的存储要求,即使是很小,随着数百或数千名客户进入网站,也能快速积累到可以破坏服务器正常运行的水平。

Session对象的常用属性和方法如表6-7所示。

表6-7 Session对象的常用属性和方法

alt

Session对象具有两个事件:Session_OnStart事件和Session_OnEnd事件。Session_OnStart事件在创建一个Session时被触发,Session_OnEnd事件在用户Session结束时(可能是因为超时或者调用了Abandon方法)被调用。可以在Global.asax文件中为这两个事件增加处理代码。

6.7.2 Session对象的储存

Session存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的SessionID,而其他的Session信息则保存在服务器端。这就是为什么说Session是安全的原因。在客户端只存储SessionID,这个SessionID只能被当前请求网站的客户所使用,对其他人则是不可见的;而Session的其他信息则保存在服务器端,而且永远也不发送到客户端,这些信息对客户都是不可见的,服务器只会按照请求程序取出相应的Session信息发送到客户端。所以只要服务器不被攻破,想要利用Session搞破坏还是比较困难的。下面分两个小节来讲述Session的存储。

1.在客户端的存储

在ASP.NET中客户端的Session信息存储方式有两种,分别是:使用Cookie存储和不使用Cookie存储。默认状态下,在客户端是使用Cookie存储Session信息的。有时为了防止用户禁用Cookie造成程序混乱,就会不使用Cookie存储Session信息。在客户端不使用Cookie存储Session信息的设置如下:

找到当前Web应用程序的根目录,打开Web.Config文件,找到如下段落:

alt

以上代码段中第1行的sessionState节点用于设置网站Session的状态。其中第4行cookieless="false"表示客户端使用Cookie保存Session信息。如果改为cookieless="true",客户端就不再使用Cookie存储Session信息,而是将其通过URL存储。运行已创建的Web应用程序,就会在运行出来的页面地址栏里看到如图6-14所示的SessionID:e3tgb5wzqyx23wlnyamg23kb。这段信息是由IIS自动加上的,不会影响以前正常的连接。

alt

图6-14 URL中存储SessionID

2.在服务器端的存储

在服务器端存储的Session信息可以有三种存储方式:

(1)存储在进程内

在Web.Config文件中找到如下段落:

alt

以上代码第1行设置mode="InProc",表示采用在服务器端将Session信息存储在IIS进程中的这种存储模式。当IIS关闭、重起后,这些信息都会丢失。但是这种模式的性能最高。因为所有的Session信息都存储在了IIS的进程中,所以IIS能够很快地访问到这些信息,这种模式的性能比进程外存储Session信息或是在SQL Server中存储Session信息都要快上很多。这种模式是ASP.NET的默认方式。

(2)存储在进程外

首先,要在“控制面板”里来打开“管理工具”下的“服务”,找到名为ASP.NET State Service的服务,启动它。这个服务启动一个要保存Session信息的进程。启动这个服务后,可以从“Windows任务管理器”的“进程”面板中看到一个名为aspnet_state.exe的进程,这个就是保存Session信息的进程。

然后,回到Web.config文件上述的段落中,将mode的值改为StateServer。这种存储模式就是进程外存储,当IIS关闭、重起后,这些信息都不会丢失。

实际上,这种将Session信息存储在进程外的方式不光只可以将信息存储在本机的进程外,还可以将Session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为StateServer,还需要在stateConnectionString中配置相应的参数。例如读者的计算机IP是220.115.249.99,想把Session存储在IP为220.115.249.99的计算机的进程中,就需要设置成这样:stateConnectionString="tcpip=1220.115.249.99:42424"。当然,不要忘记在220.115.249.99的计算机中装上.NET Framework,并且启动ASP.NET State Services服务。

(3)存储在SQL Server中

将Session储存在SQL Server数据库中的步骤如下:

01 启动SQL Server和SQL Server代理服务。在SQL Server中执行一个称为InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个专门用来存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。读者可以在以下路径中找到这个脚本文件:

alt

02 打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,读者可以打开企业管理器,看到新增了一个名为ASPState的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息存储在tempdb数据库的ASPStateTempSessions表中,另外一个ASPStateTempApplications表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看“管理”|“SQL Server代理”|“作业”,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期Session信息的。

03 返回到Web.config文件,修改mode的值为SQL Server。注意,还要同时修改sqlConnectionString的值,格式为:

alt

上面的代码中data source是指SQLServer服务器的IP地址,如果SQLServer与IIS是一台机子,写127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以ASP.NET的身份进行,通过如此配置,能够获得比使用userid=sa;password=口令的SQLServer验证方式更好的安全性。当然,如果SQLServer运行于另一台计算机上,读者可能会需要通过Active Directory域的方式来维护两边验证的一致性。

如何选择Session的存储方式需要根据具体的情况来分析。在客户端是否使用Cookie来存储SessionID需要程序员做一个判断,判断客户是否禁用Cookie,不过一般情况下都会采用默认情况。在服务器端如何就三种形式做出选择要根据实际需求:追求效率的话肯定采用默认的形式存储Session信息;要想持久保存Session就可以选择其他两种方式。其实,究竟采用哪种方式,最重要的是由程序员根据实际需求来分析,有时可能需要做很多测试才能决定下来采用哪种方式。

6.7.3 Session对象的使用

Session对象的使用和ViewState使用方法一样,在Session里存储一个Login的示例代码如下:

alt

可以通过如下的示例代码从Session里取得该Login:

alt

对于当前用户来说,Session对象是整个应用程序的一个全局变量,程序员在任何页面代码里都可以访问该Session对象。但某些情况下,Session对象有可能会丢失:

● 用户关闭浏览器或重启浏览器。

● 如果用户通过另一个浏览器窗口进入同样的页面,尽管当前Session依然存在,但在新开的浏览器窗口中将找不到原来的Session,这和Session的机制有关。

● Session过期。

● 程序员利用代码结束当前Session。

在前两种情况下,Session实际上仍然在内存中,因为服务器不知道客户端已关闭浏览器或改变窗口,本次Session将保留在内存中,直到该Session过期。但是程序员却无法在找到Session,因为SessionID此时已经丢失,失去了SessionID就无法从Session集合里检索到该Session。

【实例6-7】Session对象的使用

本例将创建一个简单的网页,它模拟购物车的一些简单特征。该网页会显示购物车的商品数,其中有两个按钮,一个向购物车中添加商品,另一个清空购物车。为了简化问题,仅计算商品的数量。具体实现步骤如下:

01 启动Visual Studio 2012,创建一个ASP.NET Web空应用程序,命名为“实例6-7”。

02 在“实例6-7”中创建一个名为Default.aspx的窗体。

03 单击网站的目录下的Default.aspx文件,进入“视图编辑”界面,打开“源视图”,在编辑区中<form></form>标记之间编写如下代码。

alt

上面的代码中第1行和第2行分别添加两个按钮服务器控件Button,并设置其单击事件为Click。第3行添加一个标签服务器控件Lable。

04 单击网站目录下的Default.aspx.cs文件,编写代码如下:

alt

上面的代码中第1行处理定义“清空购物车”按钮控件Button1单击事件Click的方法。第3行设置商品数量为0,并放置到Session中。第3行在标签控件上显示Session中的商品数量。第5行处理定义“添加”按钮控件Button2单击事件Click的方法。第6行判断Session中如果有数值存在,则第7行将Session中的商品数量赋值给变量i。第8行将商品数量加1。第9行将增加后的商品数量保存到Session中。如果Session中没有数值存在,则第12行设置Session中商品数量为1。

05 按快捷键Ctrl+F5运行程序,如图6-15所示,单击“添加”按钮,会重新加载页面,可以看到购物车中的商品数量已经增加了,单击两次后的效果如图6-16所示。

alt

图6-15 运行结果1

alt

图6-16 运行结果2

如果刷新页面,购物车中的数量是不会改变的,只有关闭浏览器或者使其放置时间超过20分钟,才会丢失会话信息,单击“清空购物车”按钮,可以看到商品数量就会变成0,如图6-17所示。

alt

图6-17 运行结果3

上一篇:6.6Cookies对象

下一篇:6.8Application对象

相关教程

共有条评论 网友评论

验证码: 看不清楚?