在ASP中,有两个内部对象可以进行一些信息存储,他们是Application对象以及Session对象,其中Application对象是对于整个应用程序期间而言的,他对于所有访问网站的用户来讲是共享的,而Session是对于会话期间而言的,他仅对于当前用户存在。
Session对象的主要用途是针对每个访问网站的用户来存储一些信息,例如,当用户登陆后,我们可以在该用户的session中存储信息来标识当前用户已经登录。Session的原理是这样的:当用户第一次访问网站时,IIS为这个用户分配一个标识,这个标识是一列很长的随机字符串,这个随机字符串叫做SessionID,而后服务器将其发送给客户端时期保存在Cookies中,接下来用户再访问服务器上的其他页面时,服务器获得这个SessionID,并从内存中获取和这个SessionID相关的数据,放在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分钟,如果站点的访问量非常大,那么可以将这个时间设定的短一些,从而及时放弃那些不活动的用户而节省站点服务器的内存资源。
一般来说,在实际的编程中,对于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方法,则会使得那些还有可能用到的信息丢失。
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛