首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

* 11.4  Session对象的状态管理

对于 Web 应用程序的用户数据,或是购物车购买商品等个人专用数据,并不是使用 Application 对象,而是使用 Session 对象的状态管理。

11.4.1  Session对象的基础

当尚未建立 Session 时间的用户浏览 Web 网站后,ASP.NET 的 Web 应用程序就会为用户建立 Session 时间和建立对应的 Session 对象。

1. 什么是Session对象

每一个 Session 对象具有唯一的 Session ID编号,在整个浏览 ASP.NET 应用程序的过程中(访问不同ASP.NET 程序时),都可以存取Session对象建立的变量。

在ASP.NET的Web应用程序中是使用Session ID编号判断用户是否仍在Session时间,它是直到 Session 对象的TimeOut 属性设定时间到时(默认值为20分钟),或执行 Abandon()方法后才会结束 Session 时间。

不过,用户每次执行新的 ASP.NET 程序时,TimeOut 属性都会归零重新计算,所以除非有浏览网站超过 TimeOut 属性的时间,否则用户浏览网站时间都属于同一个Session时间。

如果同时有多位用户浏览网站,每位用户都指定不同的 Session ID 编号,存储此 ID 的 Session 变量只允许拥有此 ID 的用户存取,其他用户并无法存取这些变量。

ASP.NET 的 Web 应用程序在同一段时间内的 Session ID 编号是唯一值,并不会重复,但是不能使用 Session ID 作为数据表主索引,因为在不同时间,用户还是可能指定相同的 Session ID。

2. Session变量的使用

Session 变量是用户的专用数据,虽然每位用户的 Session 变量名称相同,但是值可能不同。而且只有该位用户才能存取自己的 Session 变量。例如,用户 hueyan 登录网站,建立 Session 变量的程序代码如下。

Session("username")= "hueyan"

Session("password")= "1234"

上述程序代码的 Session 变量使用字符串作为名,username 和 password 的值属于用户 hueyan。接着另一位用户 jane 也登录网站,也会替他建立一组 Session 变量,其程序代码如下。

Session("username")= "jane"

Session("password")= "4567"

上述程序代码的 Session 变量拥有相同名称,只是值不同,因为属于不同用户的 Session 变量。

3. Session对象的属性和方法

Session 对象的常用方法如表11-6所示。

表11-6  Session对象的常用方法

方    法

说    明

 Abandon()

清除用户建立的 Session 变量,也就是说再也不能存取 Session 变量的值

 Remove()

删除指定的 Session 变量,参数是 Session 变量的名称字符串

Session 对象的常用属性如表11-7所示。

表11-7  Session 对象的常用属性

属    性

说    明

TimeOut

设定和获取超过 Session 时间的时间,从第1次进入ASP.NET程序到下一次请求的间隔时间,以分钟计,默认值为20分钟

SessionID

获取用户唯一的 Session 编号,此为只读属性

LCID

使用指定区域码的设定,包含日期时间和货币等格式

11.4.2  目前有多少人仍在线

访客计数是历史记录,在线用户数是目前的实时状态,如果想知道目前有多少位用户停留在网站,其最大问题是如何判断用户目前仍在线,可以指定 TimeOut 属性以停留在网站多久时间来判断是否为在线用户,如下所示。

Session.TimeOut = 5

上述程序代码指定值是分钟,也就是说停留 5 分钟的用户算是目前在线的用户,不过,Application_Start()事件处理程序并不能指定 TimeOut 属性,它位于 Session_Start()事件处理程序。

注释:

实际上,判断用户是否仍在线是一件困难的工作,最简单的方法是使用 TimeOut 属性,但是并不能准确计算出真正仍在线的用户数,因为 TimeOut 属性值的时间差可能相差数分钟之久。

在第 16 章的聊天室中使用“时间标记”技巧,客户端网页主动定时向服务器报告是否仍在线,这样才能更准确地判断用户是否仍在线。

在线用户计数有 3 个 ASP.NET 程序文件,范例除了显示在线用户计数外,还说明如何在不同网页共享 Session 变量,如表11-8所示。

表11-8  在线用户计数的3个 ASP.NET 程序

程 序 文 件

说    明

Global.asax

建立用户列表的 Hashtable 对象和处理在线用户计数

Ch11-4-2.aspx

用户登录窗体,在登录后创建用户数据的 Session 变量,然后转址到 Ch11-4-2ShowUsers.aspx

Ch11-4-2ShowUsers.aspx

显示用户信息的 Session 变量

1. ASP.NET 程序:Global.asax

在线用户和访客计数类似,在 Session_End()事件处理程序中将用户计数减 1,以便维持在线用户计数的 Application 变量,如下所示。

01: <%@ Application Language="VB" %>

02: <script Runat="server">

03: Sub Application_Start(ByVal Sender As Object, _

04:                     ByVal E As EventArgs)

05:    Application("WhosOnline")= 0

06:    ' 初始在线用户的Application变量

07:    Dim userArray As Hashtable = New Hashtable(5)

08:    Application("UserList")= userArray

09: End Sub

10: Sub Session_Start(ByVal Sender As Object, _

11:                     ByVal E As EventArgs)

12:    Session.TimeOut = 5  ' 设定Session时间是多久

13: End Sub

14: Sub Session_End(ByVal Sender As Object, _

15:                     ByVal E As EventArgs)

16:    If Session("username")<> "" Then

17:       Application.Lock()

18:       ' 删除一位在线用户

19:       Application("WhosOnline")= _

20:                   Application("WhosOnline")- 1

21:       ' 移除Hashtable的用户

22:       Application("UserList").Remove(Session("username"))

23:       Application.Unlock()

24:    End If

25: End Sub

26: </script>

2. 程序说明

在 Application_Start()事件处理程序中的第 5 行初始化Application 变量 WhosOnline,第 7~8 行建立存储用户列表的Application变量UserList,它是一个集合对象。

Session_Start()事件处理程序的第12行将Timout属性设为5,在Session_End()事件处理程序中的第16~24 行使用 If 条件判断用户是否已经登录,如果登录,才在第19~20行将Application变量WhosOnline减1,第22行从Hashtable对象中移除用户数据。

3. ASP.NET程序:Ch11-4-2.aspx

在ASP.NET程序中建立登录窗体,登录后建立 Session 变量存储用户数据、在线计数加1且添加到用户列表,最后显示 Session 对象的属性,如下所示。

01: <%@ Page Language="VB" %>

02: <script Runat="server">

03: Sub Page_Load(Sender As Object, E As Eventargs)

04:    If Page.IsPostBack Then

05:       Session("username")= username.Text

06:       Session("password")= password.Text

07:       Application.Lock()

08:       ' 创建Hashtable元素

09:       Application("UserList").Add( _

10:                     username.Text, password.Text)

11:       ' 创建一位在线用户

12:       Application("WhosOnline")+= 1

13:       Application.Unlock()

14:       ' 显示用户信息

15:       Response.Redirect("Ch11-4-2ShowUsers.aspx")

16:    End If

17: End Sub

18: </script>

19: <html>

20: <head><title>Ch11-4-2.aspx</title></head>

21: <body>

22: <h3>请输入用户名称</h3><hr>

23: <font color="blue">

24: 现在在线共有[<%=Application("WhosOnline")%>]位用户<br>

25: </font>

26: <form Runat="server">

27: 用户名称: <asp:TextBox Id="username" Text="hueyan"

28:                 Width="200px" Runat="server"/><br>

29: 用户密码: <asp:TextBox Id="password"

30:   TextMode="Password" Width="100px" Runat="server"/><br>

31: <asp:Button Id="Button" Text="登录" Runat="server"/><br>

32: </form>

33: <%

34: Response.Write("<b>Session属性值: </b><br>")

35: Response.Write("<b>TimeOut:</b> " & _

36:                 Session.TimeOut & "<br>")

37: Response.Write("<b>SessionID:</b> " _

38:                 & Session.SessionID & "<br>")

39: Response.Write("<b>LCID:</b> " & Session.LCID & "<br>")

40: %>

41: </body>

42: </html>

4. 程序说明

第3~17行是Page_Load()事件处理程序,在送出窗体后,第5~6行建立 Session变量username和password,第9~10行将用户数据添加到用户列表的集合对象,第12行将计数加1,第15行转址至Ch11-4-2ShowUsers.aspx。

第24行显示在线用户计数,第26~32行是登录窗体,第34~39行显示Session 对象属性。

5. ASP.NET程序:Ch11-4-2ShowUsers.aspx

此ASP.NET程序是Ch11-4-2.aspx转址执行的程序,可以显示在Ch11-4-2.aspx 建立的Session变量和Application变量的用户列表中,如下所示。

01: <%@ Page Language="VB" %>

02: <script Runat="server">

03: Sub Page_Load(Sender As Object,E As Eventargs)

04:    Dim str As String = ""

05:    ' 获取IEnumerator对象

06:    Dim users As IEnumerator = _

07:          Application("UserList").GetEnumerator()

08:    ' 使用Do While循环显示Hashtable元素

09:    Do While users.MoveNext()

10:       str &= "[" & users.Current.Key & " : " & _

11:                    users.Current.Value & "]<br>"

12:    Loop

13:    show.Text = str & "<br>"

14: End Sub

15: Sub SessionOver(Sender As Object, E As EventArgs)

16:    Session.Abandon() ' 结束Session时间

17:    ' 转向到登录网页

18:    Response.Redirect("Ch11-4-2.aspx")

19: End Sub

20: </script>

21: <html>

22: <head><title>Ch11-4-2Show.aspx</title></head>

23: <body>

24: <font color="blue">

25: 现在在线共有<%=Application("WhosOnline")%>位用户<br>

26: <b>目前用户名称: </b><%=Session("username")%><br>

27: <b>目前用户密码: </b><%=Session("password")%><br>

28: </font><font color="red">

29: <b>用户列表:</b><hr>

30: <form Runat="server">

31: <asp:Label Id="show" Runat="server"/>

32: <asp:Button Id="button" OnClick="SessionOver"

33:           Text="注销用户" Runat="server"/>

34: </form>

35: </font>

36: </body>

37: </html>

6. 程序说明

第3~14行是Page_Load()事件处理程序,第6~7行获取IEnumerator对象,第9~12行的循环显示用户列表,第31行的Label控件显示,第15~19行 SessionOver()过程的第16行使用Abandon()方法终止Session时间,第18行转址至Ch11-4-2.aspx。

第25~27行显示Application变量和Session变量username与password,最后第30~34行是Web窗体,拥有Label和Button控件。

7. 网页预览

将Ch11\Ch11-4-2文件夹建立成虚拟目录后,启动浏览程序执行 Ch11-4-2.aspx 程序,可以看到目前在线有多少位用户,如图11-7所示。

图11-7显示在线用户有两位(不含自己),下方显示Session 属性值,可以看到 TimeOut 为 5 分钟。在上方 Web 窗体输入用户信息,单击“登录”按钮计入在线用户,可以看到目前有 3 位用户在线,如图11-8所示。

 

图11-7  Ch11-4-2.aspx运行结果                    图11-8  显示在线用户信息

图11-8显示的用户信息是Ch11-4-2.aspx建立的Session变量,可以共享给下一个 ASP.NET 程序,在下方显示有3位用户数据,即Hashtable 对象的内容。

单击“注销用户”按钮可以终止Session时间,看到用户计数减1,且用户数据已经从用户列表中移除。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论