侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Global.asa文件技巧用法

技术  /  管理员 发布于 7年前   377

Global.asa文件可以管理在ASP应用中两个非常苛刻的对象:Application、Session。我们都知道,.asa是文件后缀名。是Active Server Application的首字母缩写

它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件必须存放在应用程序的根目录内。每个应用程序只能有一个Global.asa文件。

关于Global.asa文件最常见的错误概念是它能为一般的使用的函数和子程序用作书库。Global.asa文件仅能用于创建对象的引用和俘获启动,以及结束Application对象和Session对象。

Global.asa文件主要基于会话级事件被访问,在以下三种情况下被调用:

  • 当Application_OnStart或Application_OnEnd事件被触发。
  • 当Session_OnStart或Session_OnEnd事件被触发。
  • 当引用一个在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("http://www.webjx.com/") End Sub </SCRIPT> 

然后调试当前虚拟目录下的任何文件,你会发现所有页面都跳转向http://www.webjx.com/<
通过此“强制进入某页”的例子,可以想象当首页需要被关注的时候是非常有必要的。

下面就以一个“在线人数”的例子来继续观察Session_OnStart和Session_OnEnd事件

二、Session_onEnd

2、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")%>在线 <a href="https:/article/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="https:/article/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。

并且值得注意的是: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.<a href='https:/article/login.asp'>Back</a>" response.end end if application.lock application("online")=application("online")+1 application.unlock %> 

当前注册会员<%=application("online")%>人。

<a href="https:/article/login.asp?logout=true">退出</a> <%else%> <form action="login.asp" method="post"> <input type="text" name="name"><br> <input type="password" name="pwd"><br> <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远远不止这些。不过我们现在先不着急全部掌握,当我们接触到数据库的时候再返回过来看,继续研究该文件,相信到那时一定又会感悟到很多。所以,还是先把上面的这些吃透吧。

希望通过本文的介绍,能给你带来帮助。


  • 上一条:
    ImageMagickObject获取图片的信息无返回值的解决办法
    下一条:
    SharePoint Server 2019新特性介绍
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客