用ASP统计用户在站点的停留时间
2004-12-29 18:42
190 查看
有两种很好的方法用来记录用户在你的站点上花费了多少时间。第一个是使用基于ASP服务器的sessions,第二是通过保持客户机端cookies。要记住,使用sessions将给服务器的处理工作增加负荷,但是它们确实提供了最简洁的方法。还有一点要注意,那就是如果用户端的浏览器不能支持cookie功能,那么这两种方法都不能工作。 ASP Session 技术 使用ASP Session 是要求你把这个session 开始的当前时间保存成那个用户的session 级别变量,这将要用到你的站点或虚拟路径下的global.asa 文件中的Session_onStart 事件句柄。然后,在Session_onEnd 事件句柄中,你就可以计算出session 持续的时间,并将这个结果写到日志文件或数据库中。在这里的例子中使用了日志文件: < script language="VBScript" runat="server" > Sub Session_onStart() ‘save the time that the session started Session("StartTime") = Now() End Sub Sub Session_onEnd() ‘get the time that the user last loaded a page ‘assumes the default session timeout of 20 minutes On Error Resume Next ‘set path and name of log file to be created ‘edit to suit your own machine directory layout ‘remember to give the directory Write or Full ‘Control permission for the IUSR_machine account strFileName = "C:Tempvisit_lengths.txt" datStartTime = Session("StartTime") datEndTime = DateAdd("n", -20 , Now()) intMinutes = DateDiff("n", datStartTime, datEndTime) If intMinutes > 0 Then ‘got a valid time so add it to the log file strInfo = "Visit ending at " & datEndTime _ & " lasted for " & intMinutes & " minute(s)." ‘add user name to the log entry string here if required ‘strInfo = strInfo & " User name: " & strUserName Set objFileObject = Server.CreateObject("Scripting.FileSystemObject") ‘open text file to append data (the ForAppending constant = 8) Set objFile = objFileObject.OpenTextFile(strFileName, 8, True) objFile.WriteLine strInfo objFile.Close End If End Sub < /script > 你可以看到,当session 结束时,我们从当前时间中减去了session 的timeout的数值,如果考虑到用户装载最后一页时所花费的时间,减去的值可以稍微小一点。这个数量由你去猜,因为用这个技术并不能测出实际值。 注意,如果你在任何页面中使用了ASP的 Session.Abandon 方法,就不能得到正确的结果。因为这种方法立即中断session,这样,从实际时间中减去session长度就会给出一个不正确的访问时间(有时候甚至是负数)。更糟糕的是,在ASP 2.0版本中,这种方法还经常彻底不能启动Session_OnEnd事件。 在某些站点上使用一种“中止服务器操作”的链接来启动Session.Abandon方法,但是根据经验,很少有用户会去点击它。他们只是转到另一个站点,让session自行中断。 这是我们从日志文件中得到的一些记录: Visit ending at 6/5/00 1:05:26 AM lasted for 2 minute (s). Visit ending at 6/5/00 1:06:14 AM lasted for 47 minute(s). Visit ending at 6/5/00 1:12:18 AM lasted for 22 minute(s). Visit ending at 6/5/00 1:29:54 AM lasted for 9 minute(s). 如果用户访问的时间少于1分钟(比如说,他们的session开始后过了1分钟还没能装载另一页),用我们的代码就不显示在列表中。从整个session长度中减去这个session的timeout ,就会得到0,在这一点我们的代码就将其舍弃: If intMinutes > 0 Then ? 当然你可以修改代码以适应自己的需要。 注意:要记住session结束后才开始写日志文件的条目。你不能立刻看到它们。如果想试着更快地看到结果,可以在页面上修改Session.Timeout 的属性。 在数据库中记录结果 要将计算的结果记录数据库中而不是日志文件中,可以创建一个适当的SQL INSERT声明,执行它来更新一个你已经提供的数据库表: ... strSQL = "INSERT INTO YourTable (UserName, SessionEnd, " _ & "SessionLength) VALUES (‘" & strUserName & " ‘, #" _ & datEndTime & "#, " & intMinutes & ")" Set oConn = Server.CreateObject("ADODB.Connection") oConn.open "DSN=yourdsn;UID=username;PWD=password;" oConn.Execute strSQL Set oConn = Nothing ... 然后你就可以用任何方式来使用这些数据了。你可以创建ASP页面来读取数据并将数据呈现给管理员,或者从数据库中将其复制到一个电子工作表中,有时间的时候再进行分析。 但是要记住,使用ASP sessions会带来一些问题。在ASP 2.0中,当主应用程序目录下的嵌套目录中有global.asa 的副本时,有时sessions 会丢失。还有,如果你在URL、页面文件名以及页面之间的超级链接中使用字母的大小写不同的话,象Navigator那样的浏览器就把URL作为大小写敏感来对待,因此不把特殊的ASP session cookie发送回来,这样这种方法的使用也是不可靠的。 “客户机端Cookie”技术 使用客户机端Cookie也很容易。完成这一工作的代码可以放在一个ASP #include 文件中,然后将它插入到站点中用户肯定会去访问的主页面中。当然,如果愿意的话可以将其插入所有的页面。只要在用户访问的过程中它工作正常,就能给出正确的结果。 设置了路径和日志文件名之后,代码定义一个子程序,将一个值附加到日志文件的,就象前面的“ASP Sessions”的例子一样。如果你愿意的话,可以取代我们使用的代码来更新一个数据库表而不是一个日志文件。 < % ‘measure visit length with cookie ‘set path and name of log file to be created ‘edit to suit your own machine directory layout ‘remember to give the directory Write or Full ‘Control permission for the IUSR_machine account strFileName = "C:Tempvisit_lengths.txt" Sub UpdateLogFile(intVisitLength) On Error Resume Next If intVisitLength > 0 Then ‘got a valid time so enter it into a log file strInfo = "Session ending at " & Now() _ & " lasted for " & CStr(intVisitLength) & " minute(s)." ‘add user name to the log entry string here if required ‘strInfo = strInfo & " User name: " & strUserName Set objFileObject = Server.CreateObject("Scripting.FileSystemObject") ‘open text file to append data (the ForAppending constant = 8) Set objFile = objFileObject.OpenTextFile(strFileName, 8, True) objFile.WriteLine strInfo objFile.Close Set objFile = Nothing Set objFileObject = Nothing End If End Sub 读一个存在的Cookie 现在我们可以进行实质性的工作了。代码的其余部分检查是否有一个现存的Cookie供这个用户使用,如果有的话就确认它包含有效的日期和时间(我们检查它必须是一个1990年之后的日期)。如果cookie是有效的,它随后检查自从这个用户装载最后一页(也就是他们执行这个代码的最后一次)是否已经过了30分钟以上。如果已经超过了30分钟,我们就把它算做一个新的访问,你可以根据你的站点和需求来修改这个值。 ... ‘get session start time from existing cookie if it exists datStart = CDate(Request.Cookies("SiteVisits")("StartTime")) If Year(datStart) > 1990 Then ‘cookie already exists, so get values datLast = CDate(Request.Cookies("SiteVisits")("LastTime")) If (DateDiff("n", datLast, Now()) > 30) Then ‘more than 30 minutes since last visit so count as new visit ‘get length of last visit and update log file intMinutes = DateDiff("n", datStart, datLast) UpdateLogFile intMinutes ... 这时,通过在页面的顶端执行UpdateLogFile子程序,我们已经存储了他们上一次访问的长度, 这是他们上次访问的分钟数。然后就可以把我们收集的两个值更新成当前的日期和时间,可以开始记录这次访问的长度了。 要注意,30分钟过去之后才能看到表格中的任何条目。在试验时,你可以用一个较短的值来修改代码。 记录访问的时间长度 ... ‘update values for cookie ‘use new start time and new ‘last page load‘ time datStart = Now() datLast = Now() Else ... 如果自从最后一次执行这个代码的时间少于30分钟,我们把它算成是当前访问的一部分,因此我们只需要更新cookie中的值作为他们上次访问的时间: ... ‘less than 30 minutes since last visit so count as the same visit ‘update values for cookie - just change the ‘last page load‘ time datLast = Now() End If Else ... 设置默认值 这里的代码只是在我们没有从访问者那里得到一个有效的cookie时才会执行,因此我们所能做的就是使用一个当前日期和时间的新cookie来得到最后一次访问的开始和最后的数值: ... ‘valid cookie does not exist so set values for a new one datStart = Now() datLast = Now() End If ... 创建返回Cookie值 现在,我们已经涉及到了cookie中现存值的所有可能的情况,并且我们把新的cookie值存储在datStart和datLast变量中。这样我们就可以创建发送回这个访问者的cookie了。注意,每次我们都要重新创建整个cookie,因为当试图修改其中一个值而更新cookie时,会破坏其它的所有现存值: ... ‘create cookie to send back to client ‘have to recreate whole cookie - can‘t just change some values Response.Cookies("SiteVisits")("StartTime") = datStart Response.Cookies("SiteVisits")("LastTime") = datLast Response.Cookies("SiteVisits").path = "/" ‘apply to entire site ‘make it stay on the user‘s system for three months Response.Cookies("SiteVisits").expires = DateAdd("m", 3, Now) % > cookie技术的一个问题是当访问者重新回到你的站点时,你只能测量他上次访问的长度。为此,我们允许cookie在他们的机器上存在3个月,你可以修改这个时间值来适应你的需求。 |
相关文章推荐
- asp.net统计用户在线停留时间
- 统计用户访问网站页面的停留时间
- JSP中统计用户在某页面的停留时间
- 练习--JSP定时刷新与统计用户在某页停留时间
- ASP统计用户在线时间
- 根据日志统计出每个用户在站点所呆时间最长的前2个的信息
- ASP 统计用户在线时间
- 统计用户访问网站页面的停留时间
- 如何统计用户在某一页面的停留时间?(不是网站停留时间)
- 用户行为统计分析页面停留时间计算
- 用js统计用户下载网页所需时间的脚本
- 用js统计用户下载网页所需时间的脚本
- 一个统计Linux用户登陆时间的脚本
- js记录用户行为浏览记录和停留时间(转)
- 统计单个页面的停留时间(页面访问时间)
- ASP.NET中在线用户统计
- php实现用户在线时间统计详解
- jq 更新访问次数并统计页面停留时间
- 用ASP.NET实现在线用户统计
- 如何在ASP.NET站点中实现对用户请求的监控