Sessions的介绍
什么是 Sessions?session 其实指的就是访问者从到达某个特定主页到离开为止的那段时间,每个访问者都会单独获得一个 session 。
Sessions
可以用来储存访问者的一些喜好,例如:访问者是喜好绿色背景还是兰色?访问者是否对分屏方式怀有敌意。以及访问者是否宁可浏览纯文本的站点,这些信息可以依据 sessions 来跟踪。Sessions
还可以创建虚拟购物篮。无论什么时候用户在你的网站中选择了一种产品,那么这种产品就会进入购物篮,当他或她准备离开时,就可以立即进行以上所有选择的产品的订购。这些购物信息可以被保存在 Session 中。
Sessions的使用和处理
Session
的发明是填补HTTP协议的局限,请注意HTTP协议是怎样工作的-用户发出请求,服务端作出响应,这种用户端和服务端之间的联系就是离散的,非连续的。在HTTP协议中没有什么能够允许服务端来跟踪用户请求。在服务端完成响应用户请求后,服务端不能持续与该浏览器保持连接。从网站的观点上看,每一个新的请求都是单独存在的,因此,HTTP协议被认为是stateless协议,在用户在多个主页间转换时,你就根本无法知道他的身份。
Sessions
注意
的引用就是弥补了这个缺陷。利用Sessions,你就可以在一个用户在多个主页间切换的时候也能保存他的信息。这样很多以前根本无法去做的事情变得简单多了。现在还有很多浏览器不能支持Cookies,如果想要具体了解这些,看后面的相关部分。
开始Session信息
Active Server Pages
的Sessions非常好用,你能够利用Session对象来对session全面控制,如果你需要在一个用户session中存储信息,你只需要简单的直接调用Session对象就可以了,下面是个例子:<HTML>
<HEAD><TITLE>Session
<BODY>
<%
Session(
示例</TITLE></HEAD>“Greeting”)=“欢迎!”Response.Write(Session(
%>
</BODY>
</HTML>
“Greeting”))当Active Server Page执行时,浏览器上显示出”欢迎!”的字段,脚本第一行是给Greeting赋值为”欢迎!”,第二行将这个字段显示出来。
<HTML>
<HEAD><TITLE>
<%=Session(
</Body>
</html>
不过,这种操作没什么大不了的,但是,可以假象一个同样的用户进入另一个主页,例如,下面这个Active Server Pages:另一页</TITLE></HEAD>“Greeting”)%>当他进入这页,同样的”欢迎!”又显示出来了,注意这一页没有赋值操作,这个Greeting变量的值是前面那页赋值的。
你无法用普通的脚本变量来进行这种处理,因为一般的变量只在一个单独主页内有效,而Session变量在用户离开网站前一直存在生效。
要理解的很重要的一点是Session变量是针对特定用户相联系的。针对某一个用户赋值的Session变量是和其他用户的Session变量完全独立的,不会存在相互影响。换句话说,这里面针对每一个用户保存的信息是每一个用户自己独享的,不会产生公享情况。例如下面这个例子(针对于注册表的例子):
<%
Session(
Session(
%>
Session的内容
几乎所有的Session存储的内容存在Content集合中。例如,下面两个语句是等效的:
<% Session(
<% Session.Contents(
“MyVar”)=“Some data” %>“MyVar”)=“Some data” %>正如前面对集合的讨论中说道的,你仍然可以利用Count属性来检查集合的数量。同样你也可以利用FOR EACH,FOR ...NEXT循环来显示Content所有内容。下面的例子使用了这些方法:
<%
Session(
“Username”)=“谢建云”Session(
“Usercompany”)=“迈至科网络”%>
这里面
Session对象的Content集合一共有<%=Session.Content.Count%>项。<hr>
<%
FOR EACH thing IN Contents
Response.Write(
NEXT
%>
<hr>
<%
FOR I=1 to Session.Contents.Count
Response.Write(
NEXT
%>
“<br>“&thing&Session.Contents(thing))“<br>“&Session.Contents(i))在这个脚本中,创建了两个
Session结束的控制
服务器怎么知道一个Session结束了呢?换句话说,怎样知道是否已经离开了这个站点而去了另一个站点或者已经关掉电脑看电影去了呢。如果一个人一直没有提出请求或者刷新主页长达20分钟,那么服务器就默认为用户已经离开了。这种策略就使得服务端可以释放对用户进程进行跟踪时使用的资源。
对于有些网络站点,20分钟显然有些短,例如,对于高水平选手进行的网络围棋,很多步子是要长考的。那么这时候20分钟如果释放了资源,这个棋手就可能被服务端轰出局,这就不爽了。
有些网络站点则相反,资源有限而访问量又很大,没有什么需要耗费时间的信息传递,那么白白浪费资源是很可惜的,也会使其他访问者的访问速度受到影响。
不过,对于Active Server Pages来说,对这些进行控制都没什么难度,Session对象有这种Timeout属性,你完全可以限定一个Session存在的限定时间。例如:下面这个脚本将限制时间设为60分钟:
<% Session.Timeout=60 %>
注意
你也可以利用Internet Service Manager来进行这种控制。从Application设置对话框中,点击Active Server Pages表并且限定Session的限制时间。
当用户的Session时间过期后,如果用户刷新了主页,那么将被认为是新的访问者,所有以前的Session信息会全部失去。你也可以利用Abandon方法来消除一个Session。这里再引入一个SessionID属性,这将自动分别为每一个Sessioin分配不同的编号。
<HTML>
<HEAD><TITLE>Abandon Session</TITLE></HEAD>
<BODY>
<BR>
<% Session.Abandon %>
<BR>
</BODY>
</HTML>
Sessions事件
和其他对象不同的是,Session对象中有事件(Event)。一共两种:Session_OnStart事件,当一个Session开始时被触发。还有Session_OnEnd事件,当一个Session结束时被触发。在一个脚本中你可以和其中一个并且只能和其中一个事件关联。
在事件触发时下面这些脚本的语句被执行。这两个脚本位于特定的文件Global.asa。这个文件位于你的网站应用的根目录。它包括了一些通用程序段和你的网站应用。Global.asa文件有如下结构:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Application_OnStart
END SUB
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Application_OnEnd
END SUB
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnStart
END SUB
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnEnd
END SUB
</SCRIPT>
注意
下一章提供更加详细的关于Global.asa文件的内容
Global.asa
包括四个脚本。这里面有一个是根据Session_OnStart触发,另一个是根据Session_OnEnd触发(下一章介绍剩下的另外两个脚本)请注意Global.asa使用了微软的HTML拓展<SCRIPT>标记语法来限制脚本,这也就是说,你必须用<SCRIPT>标记来引用这两个事件而不能用<%和%>符号引用。例子中Global.asa使用的是VBScript,但是你也可以使用其他脚本语言。
在Global.asa中不能有任何输出语句,无论是HTML的语法还是Response.Write()方法都是不行的,Global.asa是任何情况下也不能进行显示的。
你只需要在Global.asa中添加一些你希望执行的脚本,那么只要Session一创建,这些脚本就会自动执行,例如下例:
<SCRIPT LANGUAGE=VBScipt RUNAT=Server>
SUB Session_OnStart
Session(
“Username”)=“Unknow”Session(
“Userpassword”)=“Unknow”END SUB
</SCRIPT>
这个脚本将”Unkonw”值赋给了Username和UserPassword变量。这个例子将在任何一个Session 创建的时候就执行。
Session_Onstart
脚本可以用于很多种目的。例如,你希望访问者必须浏览某一个主页,下面的例子就在用户进程开始时进行了这种引导,那么这里面使用Response.redirect方法。下面是这个例子:<Script Language=VBScript RUNAT=Server>
SUB Session_OnStart
MyHomepage=
“/homepage.asp”RequestPage=Request.ServerVariables(
IF NOT (STRCOMP(MyHomePage,RequestPage,vbTextCompare)=0) THEN
Response.Redirect MyHomePage
END IF
END SUB
</SCRIPT>
“SCRIPT_NAME”)在这个脚本中,用户请求和主页路径进行比较,如果不是一样的,用户就被自动引导到该主页。
下面的例子将Session_OnStart和Session_OnEnd都进行了使用:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnStart
Response.AppendToLog Session.SessionID&
” Starting”END SUB
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_Onend
Response.AppendToLog Session.SessionID&
” Ending”END SUB
</SCRIPT>
Session是怎样工作的?
Session
其实是利用Cookie进行信息处理的,(参见后面有关Cookies的介绍),当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。
注意
为这个用户创建的Cookie的名称是ASPSESSIONID。这个Cookie的唯一目的就是为每一个用户提供不同的身份认证。 如果你对名字是ASPSESSIONID的COOKIE感到好奇,你可以利用ServerVariables集合的COOKIE Header来接受这个信息,参看下面这个脚本:
<%=Request.ServerVariables(
Session变量自己不会存在用户浏览器上。不过,ASPSESSIONID这个cookie需要使用session变量。server使用ASPSESSIONID cookie来将特定的用户和特定的session信息联系起来。没有cookie的话,Server就不会了解到每一个特定用户在网站中移动的信息。
注意
利用SessionID变量存储ASPSESSIONID cookie和直接对名为ASPSESSIONID的cookie赋值有很大不同。微软利用了一个复杂的数学算法对SessionID进行了加密措施,以防止黑客猜测出SessionID的值并且依据这个获得不该获得的身份或权限。你可以用两种方法屏蔽掉SessionID,一种是将全站进行屏蔽,另外一种是将一个单独Active Server Page进行相应屏蔽。
如果想要将整个站点的Session操作进行屏蔽,你可以使用Internet Service Manager。从Application设置对话框,点击Active Server Pages表并且取消对Enable Session State选项的选择。
你还可以在特定的Active Server Page的首行加入使之屏蔽的语句来进行这种操作。
<% EnableSessionState=False %>
由于
Session对象使用了Cookies,那么它的兼容性就受到了限制,一些老的浏览器显然是不行的,新的浏览器象是NetScape4.0也提供了屏蔽Cookie的选项。
注意
这样就出了问题、由于Cookie不能适用于所有浏览器,那么在建站时你就必须注意了,如果你的网站定位于大众通用,就必须考虑各种不同的用户情况。不过现在确实有可以替代的方法,有些取代Cookies来进行身份认证的方法将在后面的章节中进行讨论。
Cookies
很少有网络技术能够象cookies来在网络用户间制造这样大的争论。Cookies只是一个无辜的名字,但是许多用户将这与邪恶的目的连在一起。
Netscape
首先在它的浏览器中引入了cookies,从那时起,World Wide Web协会就支持cookie标准。大部分浏览器现在都兼容cookie的使用。Cookies
目前有些
是什么?浏览器用一个或多个限定的文件支持Cookie。这些文件在Windows机器上叫做Cookie文件或者在Macintosh中叫做magic cookie文件,被网站用来在上面存储Cookie数据。网站可以在这些Cookie文件中插入信息。这样对有些网络用户就有些副作用。有些用户认为这造成了对隐私的侵犯。更糟的是:有些人认为Cookie是对个人空间的侵占。Cookie是临时的,还有一些则是持续的。例如,cookies被Active Sever Pages用来跟踪用户进程直到用户离开网站。另外有些Cookie则保持在Cookie文件中直到用户返回时又进行调用。在cookie文件中保存cookies会产生很大的问题。主要是有些用户担心会跟踪用户网上冲浪的习惯。害怕这种信息如果落入一些‘黑手’,那么个人也就可能成为一大堆广告垃圾信笺的对象,不过,这种担心根本不会发生,因为无法跨过网站来获得cookie信息,以这种目的来应用Cookie是不可能的。不过,由于一些用户错误的理解以及‘以讹传讹’,一些浏览器开发商别无选择只能作出响应(例如Netscape4.0提供了屏蔽Cookie的选项)。
注意
目前一些有关Cookie侵犯隐私权的讨论已经到了歇斯底里的地步,甚至包括网站站长、专家级的一些人物也在这种认识上犯过错误。
更过分的是,很多技巧的技术甚至已经可以在不能屏蔽
目前的主流浏览器是这样的,IE和NETSCAPE都提供了附加的控制Cookie的手段,其中NETSCAPE4.0不但可以对接受Cookie进行警告,而且还可以屏蔽掉Cookie, IE3.0也可以屏蔽Cookie,但是由于微软开发出了Active Server Pages,因此在IE4.0中就只能进行接受警告而没有提供屏蔽选项。cookie的浏览器上进行Cookie的屏蔽。例如,将你的cookie文件作成只读(参见