用ASP统计用户在站点的停留时间(2)

发表于:2007-06-30来源:作者:点击数: 标签:
然后你就可以用任何方式来使用这些数据了。你可以创建ASP页面来读取数据并将数据呈现给管理员,或者从 数据库 中将其复制到一个电子工作表中,有时间的时候再进行分析。 但是要记住,使用ASP sessions会带来一些问题。在ASP 2.0中,当主应用程序目录下的嵌套
然后你就可以用任何方式来使用这些数据了。你可以创建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 aclearcase/" target="_blank" >ccount

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个月,你可以修改这个时间值来适应你的需求。



原文转自:http://www.ltesting.net