Global.asa文件技巧用法(2)

3、online.asp

<% 
if request.querystring("logout")="true" then 
session.Abandon() 
response.end 
end if 
%> 
当前共有<%=Application("OnLine")%>在线 
<a href="online.asp?logout=true">退出</a> 

你发现在该页中只有一个Application("OnLine"),而且还是被显示引用的。那么其值来自何方?这正是Global.asa文件的关键所在。你可以在本机依次打开个窗口,进行进行关闭窗口或退出两种方法的调试。

三、继续细化一下

上面的程序你会发现:当进行“退出”连接后关闭窗口和直接关闭窗口效果是不一样的。因为Session存在时间的缘故,当直接进行关闭窗口,并不能触发Session_OnEnd事件,所以该如何实现这个几乎不可能的想法呢?

大家都知道,当网页进行关闭的时候可以连带一个onunload事件,那么该onunload只要能执行Session的注销功能不就我们需要的吗?废话少说,将online.asp进行修改

<% 
if request.querystring("logout")="true" then 
session.Abandon() 
response.end 
end if 
%> 
<body onunload=javascript:window.open("exit.asp")> 
当前共有<%=Application("OnLine")%>在线 
<a href="online.asp?logout=true">退出</a> 

注意,online.asp进行onunload的时候会打开exit.asp,那只要在exit.asp中再设置session.Abandon()不就OK了。

exit.asp

<%session.Abandon()%> 
<script> 
self.close() 
</script> 

当然,加了段Script脚本,目的是进行Session的注销以后立即进行关闭本身。那现在基本一个在线统计的Web应用就可以了。

四、深入研究Global.asa

从上面的调试中,举一反三的你,一定会提出一个问题:如何控制注册用户在线人数?那下面几个文件一个一个看:

5、Global.asa(放在被调试的虚拟目录的根目录下面)

<SCRIPT LANGUAGE="VBScript" RUNAT="Server"> 
Sub Application_OnStart 
application("online")=0 
End Sub 
Sub Session_OnStart 
End Sub 
Sub Session_OnEnd 
if session.contents("pass") then '判断是否为登录用户的Session_OnEnd 
application.lock 
application("online")=application("online")-1 
application.unlock 
end if 
End Sub 
Sub Application_OnEnd 
End Sub 
</SCRIPT> 

注意本Global.asa中的Session_OnStart块不做任何事件。

因为一旦有用户访问服务器而不管用户是否登录,都会产生OnStart事件,而现在需要的只是登录用户的在线,所以不能在OnStart事件里使Application("online")加1。

又因为不管是否是登录用户的会话结束都会产生OnEnd事件(假如有访客访问了服务器但并不登录,他的会话结束后也会产生OnEnd事件),所以在Session_OnEnd事件里用了句if语句来判断是否为已登录用户的OnEnd事件,如果是才将在线人数减1。