请教有关 Session_OnEnd 的问题

dingdangy 2002-08-27 03:50:47
global.asa 文件如下:
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
'当服务器开启时,设置用户数为0
Application("UserNum") = 0
Application("Conn_Str") = "dsn=zgc;uid=;pwd="
End Sub

Sub Session_OnStart
Session.Timeout = 2
'当开始一个Session时用户数加1
Application.Lock
Application("UserNum") = Application("UserNum") + 1
Application.UnLock
End Sub

Sub Session_OnEnd
sql = "select loginok from cgzgc.dbo.login where username='" & Session("username") & "'"

Set conn = Server.CreateObject("ADODB.Connection")
conn.Open Application("Conn_Str")

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql,conn,3,3

rs("loginok") = "0"
rs.Update

rs.Close
Set rs = Nothing

conn.Close
Set conn = Nothing

'当结束一个Session时用户计数器减1
Application.Lock
Application("UserNum") = Application("UserNum") - 1
Application.UnLock
End Sub
</SCRIPT>

logout.asp 文件如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
Session.Abandon()
Response.Redirect("index.asp")
%>

意图是:
当用户退出登录时,将数据库中他的帐号下的 loginok 置 0 表示其未登录。
将代码写进 Session_OnEnd 事件里,是希望无论正常退出,还是非正常退出(例
如直接关闭浏览器),均可以更新数据库。

问题:
该对数据库进行操作的代码并不执行(注意:在其它地方是可以执行的,只
是在 Session_OnEnd 事件里好像不执行)。请问各路高手,是哪里出了问题,或
者要解决这样的需求还有没有其它的办法?
...全文
26 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
julyclyde 2002-08-28
因为onend时标准对象大都不能使用
回复
dingdangy 2002-08-28
看来关心这个问题的人不太多。大家看看下面这段话:

首先,作为一个应用程序,就必须有其初始化过程。在ASP里,约定了globla.asa文件作为整个程序的初始化文件。
Globla.asa文件包含四个过程,即Application_onstrat、Application_onend、Session_onstrat、Session_onend,这四个过程时固定的,也就是说,在应用程序初始化文件里,只有这四个过程能被触发。
Application_onstrat过程在应用程序第一次运行时被触发,在这个过程里,可以进行数据库操作,进行数据检索。当在这个过程中定义变量后,变量全局有效。由于有不同的程序可能同时调用Application对象,为了保证变量存储时的正确性,在变量存储时,要把Application对象锁定,即Application.Lock,存储后再开锁,Application.UnLock,这样才能保证整个应用程序运行过程中的稳定性。在整个应用程序运行过程中,Application对象的变量值都是有效的,我们可以用来存储一些公共的数值,比如访问人数,在线人数等等。
Application_onend过程在应用程序关闭时被触发,但由于服务器在关闭程序时,往往不会等待应用程序的关闭,所以在Application_onend过程中的操作将不会被有效的执行,因此,Application_onend过程是不可靠的。
Session_onstrat是用户向第一次应用程序第一页发出请求时被触发,这个过程为用户打开一个会话,保存用户的私人信息。在这个过程中,是不可以进行数据库的检索操作的。
Session_onend过程是在应用程序结束一个用户会话时被触发,同样也不能进行数据库的检索操作。于是我们便在考虑设计时充分利用这一点,在globla.asa文件中约定好应用程序的全局变量。

通过这几段文字,基本可以解决上面提出的问题了。即在Session_OnEnd事件中不要进行任何数据库的操作。那么要实现本贴的需求,可以采用Davelu(豆腐)兄提到的方法。不过具体实施起来还有些细节的技术问题需要解决,并且这种方法的确是存在一定漏洞的。因此看来要给出一个完美的登录解决方案,不是Session技术能解决的了。

好了,这次就讨论到这里,开始派发分数了。
回复
dingdangy 2002-08-27
以前也曾查看过类似问题的帖子,但似乎比较一致的意见就是避免在Session_OnEnd 事件中对数据库进行操作。但我一直不理解,这样正常的操作为何不允许呢?我想微软还不至于没想到这个的实用价值吧!!^_^

大家多多发言呀!!分数可以再加哟,100分是不够的了!!!
回复
dingdangy 2002-08-27
继续欢迎各路高手讨论!!希望通过这样的讨论不仅解决小弟的问题,也让更多的人了解Asp中Session的一些机制。
回复
dingdangy 2002-08-27
Davelu(豆腐):请注意,客户退出后,他的Session会通过logout.asp中的Session.Abandon语句触发Session_OnEnd事件。待Session_OnEnd事件中的语句执行完毕和,即结束此用户的Session。

sqsq999(琼):你说的这个并不是一个语法不规范的问题,Application_OnEnd()事件在我这里没有必要使用,我不需要在服务器停止服务时进行什么操作,所以就免去不写了,这个是允许的。很多书上讲的都太教条了。

另外,要解决这个问题,大家应先明确一点。Session_OnEnd事件是在用户的Session提出结束申请后(例如Session.Abandon)或者Time_Out时间到了后触发,而在该事件没有执行完毕前,需要结束的Session的所有信息都还保存,知道进行到End Sub。之后这个Session才彻底消失!
回复
sqsq999 2002-08-27
哥们我的asp水平一有现了!不过我看你的代玛!发现是和我看的书上不同的!我记的好象在书上讲的有这么说的Application_OnStart()........Application_OnEnd()!你在结束时我看没有Application_OnEne()这个解释事件!是不是这个原因呀!:)见笑了
回复
ijianbo 2002-08-27
Session_onend 无法确定什么时候执行?
回复
Davelu 2002-08-27
你的global.asa什么时候关闭呀,别忘了它是在服务器端,并不是在客户端运行,客户退出并不会触发它的Session_OnEnd。
解决的办法是你利用Session和Application变量就可以了,进来一个同时在Session和Application里添加。过一段时间检查一次,如果Application里有,Session里没有,就说明已经退出了。
回复
dingdangy 2002-08-27
错误!Session("username") 在 Session_OnEnd 事件中一直有效,直到该事件结束,即执行到End Sub。
回复
meizz 2002-08-27
Session_onend 里的Session已经为空了。
回复
发动态
发帖子
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
社区公告
暂无公告