标题：Global.asa
基本内容
首先.asa是文件后缀名，它是Active Server Application的首字母缩写。Global.asa文件可以管理在ASP应用中两个非常苛刻的对象：Application、Session。 
它其实是一个可选文件，程序编写者可以在该文件中指定事件脚本，并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的，而是用来存储事件信息和由应用程序全局使用的对象。该文件必须存放在应用程序的根目录内。每个应用程序只能有一个Global.asa文件。 
关于Global.asa文件最常见的错误概念是它能为一般的使用的函数和子程序用作书库。Global.asa文件仅能用于创建对象的引用和俘获启动，以及结束Application对象和Session对象。
Global.asa 它可包含可被 ASP 应用程序中每个页面访问的对象、变量以及方法的声明。所有合法的浏览器脚本都能在 Global.asa 中使用。
可包含内容：
Application 事件
Session 事件
<object> 声明
TypeLibrary 声明
#include 指令
被调用条件
Global.asa文件主要基于会话级事件被访问，在以下三种情况下被调用： 
1，当Application_OnStart或Application_OnEnd事件被触发。 
2，当Session_OnStart或Session_OnEnd事件被触发。 
3，当引用一个在Global.asa文件里被实例化的对象（Object）。
Global.asa的标准文件格式
如下： 
<SCRIPT LANGUAGE="VBScript" RUNAT="Server"> 
Sub Application_OnStart 
'Application_OnStart 当任何客户首次访问该应用程序的首页时运行 
End Sub 
Sub Session_OnStart 
'Session_OnStart 当客户首次运行 ASP 应用程序中的任何一个页面时运行 
End Sub 
Sub Session_OnEnd 
'Session_OnEnd 当一个客户的会话超时或退出应用程序时运行 
End Sub 
Sub Application_OnEnd 
'Application_OnEnd 当该站点的 WEB 服务器关闭时运行 
End Sub 
</SCRIPT>
一、Session_onStart先看一个控制用户进入页面的代码： 
1，Global.asa（放在被调试的虚拟目录的根目录下面） 
<SCRIPT LANGUAGE="VBScript" RUNAT="Server"> 
Sub Session_OnStart '只要是用户第一次登录本站，则会跳转到首页 
response.redirect("index.asp") 
End Sub 
</SCRIPT> 
然后调试当前虚拟目录下的任何文件，你会发现所有页面都跳转向index.asp
通过此“强制进入某页”的例子，可以想象当首页需要被关注的时候是非常有必要的。 
下面就以一个“在线人数”的例子来继续观察Session_OnStart和Session_OnEnd事件
二、Session_onEnd2，Global.asa（放在被调试的虚拟目录的根目录下面） 
<SCRIPT LANGUAGE=VBScript RUNAT=Server> 
Sub Application_onStart '初始值为0 
Application("OnLine") = 0 
End Sub 
Sub Session_onStart '一个用户访问进行记数加1 
Application.Lock 
Application("OnLine") = Application("OnLine") + 1 
Application.Unlock 
End Sub 
Sub Session_OnEnd '一个用户进程的结束，记数减1 （P.S.如果没有该事件程序，则执行的就是页面访问程序了。） 
Application.Lock 
Application("OnLine") = Application("OnLine") - 1 
Application.Unlock 
End Sub 
</SCRIPT> 
3，online.asp 
<% 
if request.querystring("logout")="true" then 
session.Abandon() 
response.end 
end if 
%> 
当前共有<%=Application("OnLine")%>在线 
退出 
你发现在该页中只有一个Application("OnLine")，而且还是被显示引用的。那么其值来自何方？这正是Global.asa文件的关键所在。 
你可以在本机依次打开个窗口，进行关闭窗口
三、继续细化一下上面的程序你会发现：当进行“退出”连接后关闭窗口和直接关闭窗口效果是不一样的。因为Session存在时间的缘故，当直接进行关闭窗口，并不能触发Session_OnEnd事件，所以该如何实现这个几乎不可能的想法呢？ 
大家都知道，当网页进行关闭的时候可以连带一个onunload事件，那么该onunload只要能执行Session的注销功能不就我们需要的吗？废话少说，将online.asp进行修改 
3，online.asp 
<% 
if request.querystring("logout")="true" then 
session.Abandon() 
response.end 
end if 
%> 
<body onunload=javascript:window.open("exit.asp")> 
当前共有<%=Application("OnLine")%>在线 
退出 
注意，online.asp进行onunload的时候会打开exit.asp，那只要在exit.asp中再设置session.Abandon()不就OK了。 
4，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事件里使Applicaiton("online")加1。 
又因为不管是否是登录用户的会话结束都会产生OnEnd事件（假如有访客访问了服务器但并不登录，他的会话结束后也会产生OnEnd事件），所以在Session_OnEnd事件里用了句if语句来判断是否为已登录用户的OnEnd事件，如果是才将在线人数减1。 
并且值得注意的是：session.contents("pass")的使用，因为在OnEnd事件里禁止使用Session对象，但是可以用Session对象的集合来调用session变量。也就是说不能直接写session("pass")，而是需要写session.contents("pass")。 
6，login.asp 
<% 
if request.querystring("logout")="true" then 
session.Abandon() 
end if 
submitname=request.form("submit") 
if submitname="submit" then 
name=request.form("name") 
pwd=request.form("pwd") 
if name="cnbruce" and pwd="cnrose" then 
session("name")=name 
session("pass")=true 
else 
response.write "Error Name Or Pwd.Back" 
response.end 
end if 
application.lock 
application("online")=application("online")+1 
application.unlock 
%> 
当前注册会员<%=application("online")%>人。 
退出 
<%else%> 
<form action="login.asp" method="post"> 
<input type="text" name="name">
<input type="password" name="pwd">
<input type="submit" name="submit" value="submit"> 
<%end if%> 
只是简单地检测用名是cnbruce，密码是cnrose的时候，生成一个session("pass")=true，就是放在Global.asa中判断的。
五，继续发挥想象想想，再想想。仅仅统计有多少人在线是不够的，还要判断用户的在线状态。 
可以想象办法基本，当用户登录的时候，在login.asp里将online设为1（如果有数据库则上传），但用户离线时将online设为0，要完善它，就要修改一下Session_OnEnd事件，在该事件里将online设为0（同样将为0的值上传）……
Global.asa 中的事件
Global.asa 中，我们可以告知 application 和 session 对象在启动和结束时做什么事情。完成此项任务的代码被放置在事件操作器中。Global.asa 文件能包含四种类型的事件：
Application_OnStart- 此事件会在首位用户从 ASP 应用程序调用第一个页面时发生。此事件会在 web 服务器重起或者 Global.asa 文件被编辑之后发生。"Session_OnStart" 事件会在此事件发生之后立即发生。
Session_OnStart- 此事件会在每当新用户请求他或她的在 ASP 应用程序中的首个页面时发生。
Session_OnEnd- 此事件会在每当用户结束 session 时发生。在规定的时间（默认的事件为 20 分钟）内如果没有页面被请求，session 就会结束。
Application_OnEnd- 此事件会在最后一位用户结束其 session 之后发生。典型的情况是，此事件会在 Web 服务器停止时发生。此子程序用于在应用程序停止后清除设置，比如删除记录或者向文本文件写信息。
Global.asa 实例
在这个例子中，我们要创建一个可计算当前访客的 Global.asa 文件。
Application_OnStart 设置当服务器启动时，Application 变量 "visitors" 的值为 0。
每当有新用户访问时，Session_OnStart 子例程就会给变量 "visitors" 加 1。
每当 Session_OnEnd 子例程被触发时，此子例程就会从变量 "visitors" 减 1。
Global.asa 文件：
<script language="vbscript" runat="server">
Sub Application_OnStartApplication("visitors")=0 
End SubSub Session_OnStart
Application.LockApplication("visitors")=Application("visitors")+1 
Application.UnLock
End Sub 
Sub Session_OnEndApplication.LockApplication("visitors")=Application("visitors")-1Application.UnLockEnd Sub
</script>
此 ASP 文件会显示当前用户的数目：
<html> 
<head> 
</head> 
<body> 
<p>There are <%response.write(Application("visitors"))%> online now!
</p> 
</body>
</html>
[1]