session 在所有的后台语言里面都是可以直接访问得,例如要创建一个名为user的session:
session(“user”) = “username”
改变一个session
session(“user”) = “username1”
一、Session 对象
可以使用 Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
Session 对象最常见的一个用法就是存储用户的登录信息或者用户设置。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
注意: 会话状态仅在支持 cookie 的浏览器中保留。
可以使用 Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
Session 对象最常见的一个用法就是存储用户的登录信息或者用户设置。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
注意: 会话状态仅在支持 cookie 的浏览器中保留。
语法
Session的集合|属性|方法:
Session的集合|属性|方法:
1.集合
Contents 包含已用脚本命令添加到会话中的项目。
StaticObjects 包含通过 <OBJECT> 标记创建的并给定了会话作用域的对象。
Contents 包含已用脚本命令添加到会话中的项目。
StaticObjects 包含通过 <OBJECT> 标记创建的并给定了会话作用域的对象。
2.属性
CodePage 将用于符号映射的代码页。
LCID 现场标识。
SessionID 返回用户的会话验证。
Timeout 应用程序会话状态的超时时限,以分钟为单位。
CodePage 将用于符号映射的代码页。
LCID 现场标识。
SessionID 返回用户的会话验证。
Timeout 应用程序会话状态的超时时限,以分钟为单位。
3.方法
Abandon 该方法破坏 Session 对象并释放其资源。
Abandon 该方法破坏 Session 对象并释放其资源。
4.事件
global.asa 文件中声明下列事件的脚本。
global.asa 文件中声明下列事件的脚本。
Session_OnEnd
Session_OnStart
Session_OnStart
注:global.asa 文件只有在网站根目录时才有效.
举例:
可以在 Session 对象中存储值。存储在 Session 对象中的信息在会话及会话作用域内有效。下列脚本演示两种类型的变量的存储方式。
可以在 Session 对象中存储值。存储在 Session 对象中的信息在会话及会话作用域内有效。下列脚本演示两种类型的变量的存储方式。
<%
Session(“username”) = “Janine”
Session(“age”) = 24
%>
Session(“username”) = “Janine”
Session(“age”) = 24
%>
但是,如果将对象存储在 Session对象中,而且使用 VBScript 作为主脚本语言。则必须使用关键字 Set。如下列脚本所示。
<% Set Session(“Obj1”) = Server.CreateObject(“MyComponent.class1”) %>
然后,就可以在后面的 Web 页上调用 MyComponent.class1 揭示的方法和属性,其调用方法如下:
<% Session(“Obj1”).MyMethod %>
也可以通过展开该对象的本地副本并使用下列脚本来调用:
<%
Set MyLocalObj1 = Session(“Obj1”)
MyLocalObj1.MyObjMethod
%>
Set MyLocalObj1 = Session(“Obj1”)
MyLocalObj1.MyObjMethod
%>
创建有会话作用域的对象的另一种方法是在 global.asa 文件中使用 <OBJECT> 标记。
但是不能在 Session 对象中存储内建对象。例如,下面每一行都将返回错误。
<%
Set Session(“var1”) = Session
Set Session(“var2”) = Request
Set Session(“var3”) = Response
Set Session(“var4”) = Server
Set Session(“var5”) = Application
%>
Set Session(“var1”) = Session
Set Session(“var2”) = Request
Set Session(“var3”) = Response
Set Session(“var4”) = Server
Set Session(“var5”) = Application
%>
在将对象存储到 Session 对象之前,必须了解它使用的是哪一种线程模型。只有那些标记为“Both”的对象才能存储在没有锁定单线程会话的 Session 对象中。
若将一个数组存储在 Session对象中,请不要直接更改存储在数组中的元素。例如,下列的脚本无法运行。
<% Session(“StoredArray”)(3) = “new value” %>
这是因为 Session对象是作为集合被实现的。数组元素 StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中,并将覆盖此位置以前存储的任何信息。
在将数组存储在 Session对象中时,在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时,应再将数组全部存储在 Session 对象中,这样所做的任何改动将被存储下来。下列的脚本对此进行演示。
—file1.asp—
<%
‘Creating and initializing the array
Dim MyArray()
Redim MyArray(5)
MyArray(0) = “hello”
MyArray(1) = “some other string”
<%
‘Creating and initializing the array
Dim MyArray()
Redim MyArray(5)
MyArray(0) = “hello”
MyArray(1) = “some other string”
‘Storing the array in the Session object
Session(“StoredArray”) = MyArray
Session(“StoredArray”) = MyArray
Response.Redirect(“file2.asp”)
%>
%>
—file2.asp—
<%
‘Retrieving the array from the Session Object
‘and modifying its second element
LocalArray = Session(“StoredArray”)
LocalArray(1) = ” there”
<%
‘Retrieving the array from the Session Object
‘and modifying its second element
LocalArray = Session(“StoredArray”)
LocalArray(1) = ” there”
‘printing out the string “hello there”
Response.Write(LocalArray(0)&LocalArray(1))
Response.Write(LocalArray(0)&LocalArray(1))
‘Re-storing the array in the Session object
‘This overwrites the values in StoredArray with the new values
Session(“StoredArray”) = LocalArray
%>
‘This overwrites the values in StoredArray with the new values
Session(“StoredArray”) = LocalArray
%>
示例
下列代码将字符串 MyName 分配给名为 name 的会话变量,并给名为 year 的会话变量指定一个值,而且为 some.Obj 组件的实例指定一个名为 myObj 的变量。
下列代码将字符串 MyName 分配给名为 name 的会话变量,并给名为 year 的会话变量指定一个值,而且为 some.Obj 组件的实例指定一个名为 myObj 的变量。
Session(“name”) = “MyName”
Session(“year”) = 96
Set Session(“myObj”) = Server.CreateObject(“someObj”)
%>
Session(“year”) = 96
Set Session(“myObj”) = Server.CreateObject(“someObj”)
%>
二、如何取得所有的Session变量
在程序调试中,有时候需要知道有多少Session变量在使用,她们的值如何?由于Session对象提供一个称为Contents的集合(Collection),我们可以通过For…Each循环来达到目标:
Dim strName, iLoop
For Each strName in Session.Contents
Response.Write strName & ” – ” & Session.Contents(strName)& “<BR>”
Next
For Each strName in Session.Contents
Response.Write strName & ” – ” & Session.Contents(strName)& “<BR>”
Next
一般情况下,上面的代码可以工作得很好。但当Session变量是一个对象或者数组时,打印的结果就不正确了。
这样我们修改代码如下:
‘首先看看有多少Session变量在使用?
Response.Write “共有 ” & Session.Contents.Count &”个 Session 变量<P>”
Dim strName, iLoop
‘使用For Each循环察看Session.Contents
For Each strName in Session.Contents
‘如果Session变量是一个数组?
If IsArray(Session(strName)) then
‘循环打印数组的每一个元素
For iLoop = LBound(Session(strName)) to UBound(Session(strName))
Response.Write strName & “(” & iLoop & “) – ” & _
Session(strName)(iLoop) & “<BR>”
Next
Elseif isObject(Session(strName)) then
Response.Write “isobject:”& strName & ” – ” & Session.Contents(strName)& “<BR>”
else
‘其他情况,就简单打印变量的值
Response.Write strName & ” – ” & Session.Contents(strName) & “<BR>”
End If
Next
Dim strName, iLoop
‘使用For Each循环察看Session.Contents
For Each strName in Session.Contents
‘如果Session变量是一个数组?
If IsArray(Session(strName)) then
‘循环打印数组的每一个元素
For iLoop = LBound(Session(strName)) to UBound(Session(strName))
Response.Write strName & “(” & iLoop & “) – ” & _
Session(strName)(iLoop) & “<BR>”
Next
Elseif isObject(Session(strName)) then
Response.Write “isobject:”& strName & ” – ” & Session.Contents(strName)& “<BR>”
else
‘其他情况,就简单打印变量的值
Response.Write strName & ” – ” & Session.Contents(strName) & “<BR>”
End If
Next
三、Session变量有时候不能工作,为什么?
有很多可能性:
第一,如果客户端不允许cookie操作,session将失效。因为session是依赖于cookie的。
第二,session有失效时间的设定。缺省的设置是20分钟。你可以在ASP中设置:Session.timeout=60 ;或者在IIS中设置站点属性的连接超时秒数。
第三,session是和具体的Web Application相关的。如果用户从/products/default.asp浏览到/jobs/default.asp,也可能造成session的重新创建。
有很多可能性:
第一,如果客户端不允许cookie操作,session将失效。因为session是依赖于cookie的。
第二,session有失效时间的设定。缺省的设置是20分钟。你可以在ASP中设置:Session.timeout=60 ;或者在IIS中设置站点属性的连接超时秒数。
第三,session是和具体的Web Application相关的。如果用户从/products/default.asp浏览到/jobs/default.asp,也可能造成session的重新创建。
四、怎么清除一个不再需要的session变量但不使session失效?
在ASP3.0中:Session.Contents.Remove ”变量名”可以清除一个变量。
在ASP2.0中:set session(“变量名”)=NULL(对象)或 session(“变量名”)=empty(字符串或数值)可以清除变量。
在ASP3.0中,Session.Contents.RemoveAll可以清除所有的session变量和session.abandon不同,上面的方法都不会使目前的session过期或者无效。
在ASP3.0中:Session.Contents.Remove ”变量名”可以清除一个变量。
在ASP2.0中:set session(“变量名”)=NULL(对象)或 session(“变量名”)=empty(字符串或数值)可以清除变量。
在ASP3.0中,Session.Contents.RemoveAll可以清除所有的session变量和session.abandon不同,上面的方法都不会使目前的session过期或者无效。
五、ASP页面顶端的<%@ ENABLESESSIONSTATE=True %>是什么意思?
IIS使用一种叫做Session跟踪的技术,来保证各个Session变量在每个页面是可用的。当用户访问某个ASP页面时候,IIS会首先为这个页面准备好各个Session变量,这当然会带来性能上的影响。(使用Session变量的代价总是很高的!)
如果你有100个页面,而只有5个页面用到了Session,那么,为了整体的性能,你只需要在那5个页面设置:
<%@ ENABLESESSIONSTATE=True %>
而其他页面设置为:
<%@ ENABLESESSIONSTATE=False %>
IIS使用一种叫做Session跟踪的技术,来保证各个Session变量在每个页面是可用的。当用户访问某个ASP页面时候,IIS会首先为这个页面准备好各个Session变量,这当然会带来性能上的影响。(使用Session变量的代价总是很高的!)
如果你有100个页面,而只有5个页面用到了Session,那么,为了整体的性能,你只需要在那5个页面设置:
<%@ ENABLESESSIONSTATE=True %>
而其他页面设置为:
<%@ ENABLESESSIONSTATE=False %>