blog.cfosea.cn
尘埃在线个人博客
welcome to read the blog—http://blog.cfosea.cn
[电脑网络]如何利用global.asa文件的session_onend记录用户离开网站的时间
※尘埃※ 发表于:2009/11/13 17:36:54 阅读(3290)次 评论(0)条 编辑 删除 私密 允评 置顶 
本文链接:
    对于网页制作中,使用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页面,然后在不同的时间下关掉窗口,但两次记录的离站时间会相同。
楼主签名
有些个性,但没怎么表现!有些背叛,但一直都很守法! 有些冷默,却天性怜悯动情!想摆脱普通与平凡,但却依然徘徊未进!坚持原则,但不失灵活性!无为,但不失上进心!无情,却不失友情!想拥有钱,但却不迷于钱!
  用户登录 用户注册 进入博客 
名 称: 性 别: QqNum: 邮 箱:
个人主页: 来自地区: 头像选择: >>‖‖》》全部头像列表《《‖‖
 提示:如果您在本站注册了用户名,将允许修改自己的评论记录,同时还能在本网站评论及留言处显示您的个性签名!