您现在的位置: 365建站网 > 365学习 > 8.3 会话期间信息存储的Session对象

8.3 会话期间信息存储的Session对象

文章来源:365jz.com     点击数:661    更新时间:2009-09-12 17:12   参与评论

8.3 会话期间信息存储的Session对象

在ASP中,有两个内部对象可以进行一些信息存储,他们是Application对象以及Session对象,其中Application对象是对于整个应用程序期间而言的,他对于所有访问网站的用户来讲是共享的,而Session是对于会话期间而言的,他仅对于当前用户存在。

8.8.1 Session对象简介

Session对象的主要用途是针对每个访问网站的用户来存储一些信息,例如,当用户登陆后,我们可以在该用户的session中存储信息来标识当前用户已经登录。Session的原理是这样的:当用户第一次访问网站时,IIS为这个用户分配一个标识,这个标识是一列很长的随机字符串,这个随机字符串叫做SessionID,而后服务器将其发送给客户端时期保存在Cookies中,接下来用户再访问服务器上的其他页面时,服务器获得这个SessionID,并从内存中获取和这个SessionID相关的数据,放在Session对象的集合中。

8.8.2 Session对象的方法、属性和集合

因为Session对象的方法主要是针对Session对象的集合来操作的,因此我们首先来讲解Session对象的集合。

一般来说,我们主要使用的是Session对象的contents集合,我们可以在这个集合中存储当前用户的某些信息,例如,如下代码:

Session.Contents("username") = "hanguofeng"

则在名为username的session集合中存储了一个值为hanguofeng的字符串。

我们从session对象的集合中检索数据也非常简单,只需要直接调用即可,如:

sUserName = session.contents("username")

即将contents集合中的username元素的值赋值给变量sUserName

Session的contents集合还有一个简便的调用方法,即,省略contents字样,例如直接使用session("username")="hanguofeng"来为名为username的元素赋值。一般我们在给Session赋值或者获取Session的值时,都使用简便方法。

Session对象有三个方法,他们主要是用来删除Session集合中的数据或者放弃当前的session的,如下:

l         Contents.Remove("variable_name") 从Session.Content集合中删除一个名为variable_name的变量

l         Contents.RemoveAll() 从Session.Content集合中删除所有变量

l         Abandon() 当网页的执行完成时,结束当前用户会话并撤消当前Session对象。

Remove和RemoveAll方法的目的都是从Session.Content集合中删除变量,前者用于删除一个指定名称的变量,例如:

Session.Contents.Remove("username")

可删除在前面我们在前面建立的username变量。

Session.Contents.RemoveAll方法将删除所有的Session集合变量。

而Abandon()方法的作用为撤销Session对象,这里Abandon()方法与RemoveAll()方法有什么不同呢。

Abandon()方法使得ASP放弃当前的SessionID,并在客户下次访问页面时重新为该用户分配一个SessionID,而RemoveAll()方法仅仅删除了当前的集合,但是客户仍然使用同一个SessionID。因此他们实际体现出的区别是,在调用了Abandon()方法后,在当前的页面仍然可以访问Session集合,在关闭此页面并且开启另一个页面后,才会使得当前的Session被删除。

Session对象主要有三个比较常用的属性,如下列出:

l         CodePage 定义用于在浏览器中显示页内容的代码页(Code Page)。

l         SessionID 当前Session的SessionID值

l         Timeout 设定当前会话的超时周期。

首先来看CodePage属性,CodePage定义了当前页面输出内容的字符集,这里的字符集以数字表示,例如,简体中文的字符集是936,UTF-8的字符集是65001等,这个属性也是为了防止页面出现乱码使用的。

SessionID属性可以获得当前的用户的SessionID,一般这个属性使用的也不是很频繁,有时在客户端浏览器不支持cookies的情况下,你可以将SessionID附加在客户端的QueryString变量中,从而用来标识每个客户端。

Timeout属性的指定用于设定客户的Session超时期。客户对于SessionID并不是长期占有的,在其一段时间内没有和服务器段进行任何交互后,服务器端将放弃该Session,这里的Timeout属性即是控制这个超时时间的,例如:

Session.Timeout = 5

即将当前客户的Session超时时间设定为5分钟,这个超时时间默认是10分钟,如果站点的访问量非常大,那么可以将这个时间设定的短一些,从而及时放弃那些不活动的用户而节省站点服务器的内存资源。

8.3.3 小案例—用户登录模块

一般来说,在实际的编程中,对于Session对象使用最多的就是用户登录部分使用了,这个案例将简单的模拟一个用户登录表单、用户是否登录的判断以及用户退出的一系列功能,他一共分为这么几个页面,如图8.6所示。

图8.6

l         Login.ASP页面

在login.ASP页面中,我们将完成用户登录表单的显示,以及提交表单后,对于用户输入的密码判断和写入session的操作,其代码如下。

<%

Dim sPassword

If UCase(Request.ServerVariables("REQUEST_METHOD"))="POST" Then     '如果正在提交表单

       sPassword = Trim(Request.Form("password"))

       If sPassword = "hanguofeng" Then

              Session("password") = "hanguofeng"

              Response.Write("您已经登录成功!请访问<a href=""check.ASP"">登录检测文件</a>")

       Else

              Response.Write("您输入的密码错误!")

              Response.End()

       End If

Else

       Response.Write("<form method=""post"" action="""">")

Response.Write("请输入密码:<input name=""password"" type=""text"" />")

       Response.Write("<input type=""submit"" value=""提交"" />")

       Response.Write("</form>")

End If

%>

和你前面所见的实例类似的,这个文件也使用了ServerVariables集合的值来判断当前是提交表单,还是显示表单。

如果是POST方法请求,说明正在提交表单,那么此时就需要对用户输入的密码进行判断,如果用户输入的密码是“hanguofeng”,则此时进入密码正确的流程,首先设定名为username的session的值为hanguofeng,而后调用Response.Write方法输出登录成功的字样。否则首先调用Response.Write来显示输入密码错误的字样,然后使用Response.End()来终止页面继续运行。

如果当前是GET请求,则调用Response.Write方法来显示让用户填写密码的表单。

l         Check.ASP页面

在Check.ASP页面中我们来检测用户的session,从而判断其是否已经登录,这个页面的代码如下。

<%

Dim sPassword

sPassword = Trim(Session("password"))     '获取session

If sPassword = "" Then

       Response.Write("您还没有登录,请访问<a href=""login.ASP"">登录表单</a>")

Else

       Response.Write("您已经登录,可以访问<a href=""logout.ASP"">退出页面</a>")

End If

%>

在这个文件中,我们首先获得了名为password的session变量的值,而后调用Trim()函数去掉这个值两端的空格,而后判断其是否为空,如果为空,则说明还没有登录,否则就说明已经登录了。

l         Logout.ASP页面

Logout.ASP页面用于通过Session的Remove方法来清空cookies,从而实现用户的退出。本页面代码如下:

<%

Session.Contents.Remove("password")

Response.Write("退出成功!")

%>

为什么这里使用了Remove方法而不是RemoveAll方法呢,这是因为,我在处理这个用户退出的操作时,并不知道用户是否还在本站点其他部分保存了有用的session信息,如果使用RemoveAll方法,则会使得那些还有可能用到的信息丢失。

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (661人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------