如何记录用户离开网站的时间

  对于网页制作中,得用ASP程序来记录用户访问网站时进入的时间和IP都好做,相信一般能做ASP页面的人,都会知道如何做一个日志文件来记录用户进入网站的时间,但想记录用户离开网站的时间,却不那么容易,自己一直想对用户离站的时间进行记录但却一直不知如何操作,似乎是个比较难的问题。
  近日本人在网上搜索查看了许多相关的文字资料,看到了一些相关方法的介绍,但都是零散无序的,由于这个程序功能本身要实现就不是很容易的事,加上网上各片写的内容也是五花八门,虽有些例子也看起来不是那么的明了易懂,本人经过反复测试与观查结果,基本找到了一个相对简单可行的方法,现将测试的源码贴出来,供大家测试参考利用。
  看代码前,大家要先注意几个问题,一是本处所提到的是ASP程序的网页页面,其他程序页面请参考本代码内容再进行相关修改;二是,要实现记录用户的离站时间,从本人查看的各种资料来看,似乎几本都是采用GLOBAL.ASA这个文件,而这个文件非常特殊(不仅指文件本身,而且写入其中的代码规则也受很多限制),不太了解的请先参考相关资料,本人也只是半知半解;三是,这个文件必须放在你网站的根目录下,也就是与你的index.asp之类的文件同一目录;四是由于会涉及到数据库之间的操作,所以对于数据路径的描述要正确,主要是指ACCESS数据库,SQL数据库倒比较好操作,不易出错;五是,如果你利用这个文件测试没看到预定的结果,只能仔细查看代码,多思考,反复测试,因为如果当中的代码写的不正确,IIS可能不会给出任何提示,让你根本不清楚到底出错在哪里,这个文件好象没法象ASP页面那样,调试起来比较方便。
  下面是经过实际测试可以得到日志记录结果的代码:
-----------------------------------------------------------------------------------------------------------------
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
dim strdsn,connmote,time_in,time_out,loginip,addlog,accpath
'注意在Session_Onend中不能使用mappath(),request,response方法
'Sub Application_OnStart
'End Sub
'Sub Application_OnEnd
'End Sub

Sub Session_Onstart
session.timeout=1 '为测试方便查看结果,此处设置的超时时间为1分种,没法再短了
time_in=now() '记录用户进入网站的时间
session("time_in")=time_in '将进站时间保存在SESSION中,以便后面调用
loginip=Request.ServerVariables("REMOTE_ADDR") '记录登录用户的IP地址,这一段如放在后面,经测试是取不到值,从而数据库没有记录
if loginip="" then
loginip="匿名用户"
end if
session("loginip")=loginip
accpath="Provider=Microsoft.jet.oledb.4.0;data source="&server.mappath("databases/timetest.mdb")
session("accpath")=accpath '这两句是将连接ACCESS数据的路径信息保存在SESSION中,因为入在后面无法就无法运行
End Sub

Sub Session_Onend
on error resume next
time_in=session("time_in")
loginip=session("loginip")
accpath=session("accpath") '以上三个变量分别取出相关的参数值
time_out=now() '记录离开网站的时间
'连接SQL数据库方式
'strdsn="driver={sql server};server=mote;database=motesqldata;uid=mote;pwd=123"
'set connmote=server.createobject("adodb.connection")
'connmote.open strdsn
'连接ACCESS数据库方式
strdsn=accpath '这个地方是做了个变通,否则直接在此处将无法连接及打开ACCESS数据库
set connmote=server.createobject("adodb.connection")
connmote.open strdsn
addlog="insert into logfile(logintime,loginip,exittime) values('"&time_in&"','"&loginip&"','"&time_out&"')"
connmote.Execute(addlog) '完成一条日志记录的增加(包括进站时间,用户IP地址,离站时间)
connmote.Close
set connmote=nothing
if err then
err.clear
response.write "计数操作失败,请刷新页面,如仍无法进入网站,请联系网站管理员解决!"
response.end
end if
End Sub
</SCRIPT>
------------------------------------------------------------------------------------------------------------
  以上代码是通过GLOBAL.ASA文件来直接完成日志的记录工作,并且可以将代码再扩展一下,为网站做一个记数工作,利用这个文件,只要用户打开了网页中的任意一个ASP文件,即可增加一条网页访问日志。
考虑到代码的安全性,并便于维护,本人再次经过修改测试,将连接数据的代码定义在连接数据库的专门的包含文件内,而在此文件中直接调用即可,这样,在GLOBAL.ASA文件中,将不到数据库的相关信息,即本人将语句:
accpath="Provider=Microsoft.jet.oledb.4.0;data source="&server.mappath("databases/timetest.mdb")
session("accpath")=accpath
放在连接数据库的文件中去定义。

  另外,本人自己的网站实际在增加日志记录时,有专门的日志文件,并只对打开过首面才进行日志及记数的操作,为了能获取到用户的离站时间,配合GLOBAL.ASA文件来完成,这样,经过本人再次修改后的GLOBAL.ASA文件的源代码变成下面的样子:
--------------------------------------------------------------------------------------------------------
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
dim strdsn,connmote,time_in,time_out,loginip,addlog,datapath
'注意在Session_Onend中不能使用mappath(),request,response方法
'Sub Application_OnStart
'End Sub
'Sub Application_OnEnd
'End Sub

Sub Session_Onstart
session.timeout=1
End Sub
Sub Session_Onend
on error resume next
time_in=session("time_in") '来自首页的记数日志包含文件
datapath=session("datapath") '来自专用的数据库连接包含文件
time_out=now()
strdsn=datapath
set connmote=server.createobject("adodb.connection")
connmote.open strdsn
'addlog="insert into logfile(logintime,loginip,exittime) values('"&time_in&"','"&loginip&"','"&time_out&"')"
'addlog="update logfile set ExitTime='"&time_out&"' where LoginTime='"&time_in&"'" 'SQL数据库下使用
addlog="update logfile set ExitTime='"&time_out&"' where LoginTime=#"&time_in&"#" 'ACCESS数据库下使用
connmote.Execute(addlog)
connmote.Close
set connmote=nothing
if err then
err.clear
response.write "计数操作失败,请刷新页面,如仍无法进入网站,请联系网站管理员解决!"
response.end
end if
End Sub
</SCRIPT>
--------------------------------------------------------------------------------------------------------
  经过以上代码的测试,终于可以实现自己想记录用户离开网站的时间了,当然,这种方式记录的离站时间并不精确,但总算能得到一个大至的结果了。
  不过对于以上的代码,好象还存在一些别的问题,比如在不同的窗口分别打开ASP页面,然后在不同的时间下关掉窗口,但两次记录的离站时间会相同。


返  回