利用clickstream跟踪用户

Clickstream是一款用于跟踪网站用户点击行为的工具,能够记录用户的点击流并检测是否为机器人访问。支持集成log4j实现更高级的日志记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体的例子可以看clickstream-1.0.2.war

Clickstream 概述

一个用来跟踪正在你的站点上访问的用户所到达位置细节的工具。它允许你跟踪访问你的站点的“点击流”或者“传输路径”。请访问JIRA的更新日志 来了解Clickstream最近的发展。

特性

• 当用户会话产生时,开始跟踪点击流。(通过一个监听器 )
• 跟踪用户产生的每次点击信息。(通过一个过滤器 )
• 当用户会话终止时,将完整的点击流记录到文件或者PrintStream中。
• 设法发现用户是不是机器人,并进行适当的过滤(目前可以检测252种机器人)

安装

clickstream-1.0.2.jar and commons-logging.jar 放到[web应用程序根目录]/WEB-INF/lib里,把下面的代码加到[web应用程序根目录]/WEB-INF/web.xml里面:

<filter>
      <filter-name>clickstream</filter-name>
      <filter-class>com.opensymphony.clickstream.ClickstreamFilter</filter-class>
</filter>

<filter-mapping>
      <filter-name>clickstream</filter-name>
      <url-pattern>*.jsp</url-pattern>
</filter-mapping>

<filter-mapping>
      <filter-name>clickstream</filter-name>
      <url-pattern>*.html</url-pattern>
</filter-mapping>

<listener>
<listener-class>com.opensymphony.clickstream.ClickstreamListener</listener-class>
</listener>



根据上面的配置,Clickstream会跟踪所有对jsp或者html文件的请求.无论什么时候,只要一个HttpSession失效了,对那个会话的完整点击流就会被记录。如果你想跟踪对其他类型的点击(例如.txt或者pdf文件),只需要添加更多的filter-mapping就可以了。

下面是一个完整的web.xml的例子

 <?xml version="1.0" encoding="ISO-8859-1" ?> 
    <!DOCTYPE web-app (View Source for full doctype...)> 
    <web-app>
    <display-name>Opensymphony Clickstream Example</display-name> 
    <filter>
      <filter-name>clickstream</filter-name> 
      <filter-class>com.opensymphony.clickstream.ClickstreamFilter</filter-class> 
    </filter>
    <filter-mapping>
      <filter-name>clickstream</filter-name> 
      <url-pattern>/*</url-pattern> 
    </filter-mapping>

    <listener>
      <listener-class>com.opensymphony.clickstream.ClickstreamListener</listener-class>
    </listener>
    </web-app>



你可以利用clickstreams.jsp

<%@ page import="java.util.*,
                   com.opensymphony.clickstream.Clickstream" %>

<%
      Map clickstreams = (Map) application.getAttribute("clickstreams");

      String showbots = "false";
      if ("true".equalsIgnoreCase(request.getParameter("showbots")))
          showbots = "true";
      else if ("both".equalsIgnoreCase(request.getParameter("showbots")))
          showbots = "both";
%>
<html>
      <head>
          <title>All Clickstreams</title>
      </head>
    
      <body>
          <h1>All Clickstreams</h1>

          <a href="?showbots=false">No Bots</a> |
          <a href="?showbots=true">All Bots</a> |
          <a href="?showbots=both">Both</a>
        
          <p>        
          <% if (clickstreams.isEmpty()) { %>
            No clickstreams in progress.
          <% } else {
              synchronized(clickstreams) {
                  Iterator it = clickstreams.keySet().iterator();
                  int count = 0;
                  while (it.hasNext())
                  {
                      String key = (String)it.next();
                      Clickstream stream = (Clickstream)clickstreams.get(key);

                      if (showbots.equals("false") && stream.isBot())
                      {
                          continue;
                      }
                      else if (showbots.equals("true") && !stream.isBot())
                      {
                          continue;
                      }

                      count++;
                      try {
                  %>
                  <%= count %>. <a href="viewstream.jsp?sid=<%= key %>"><b><%= (stream.getHostname() != null &&  
!stream.getHostname().equals("") ? stream.getHostname() : "Stream") %></b></a> <font size="-1">[<%= stream.getStream().size()  
%> reqs]</font><br>
                  <%
                      }
                      catch (Exception e)
                      {
                  %>
                      An error occurred - <%= e %><br>
                  <%
                      }
                  }
              }
          }
          %>
          </p>
      </body>
</html>


和viewstream.jsp来显示系统当前的Clickstream活动。

<%@ page import="java.util.*,
                   com.opensymphony.clickstream.Clickstream,
                   com.opensymphony.clickstream.ClickstreamRequest" %>

<%
if (request.getParameter("sid") == null)
{
    response.sendRedirect("clickstreams.jsp");
    return;
}

Map clickstreams = (Map)application.getAttribute("clickstreams");

Clickstream stream = null;

if (clickstreams.get(request.getParameter("sid")) != null)
{
    stream = (Clickstream)clickstreams.get(request.getParameter("sid"));
}

if (stream == null)
{
    response.sendRedirect("clickstreams.jsp");
    return;
}
%>

<html>
      <head>
          <title>Clickstream for <%= stream.getHostname() %></title>
      </head>
    
      <body>
          <div align="right"><a href="clickstreams.jsp">All streams</a></div>

          <h1>Clickstream for <%= stream.getHostname() %></h1>

          <b>Initial Referrer</b>: <a href="<%= stream.getInitialReferrer() %>"><%= stream.getInitialReferrer() %></a><br>
          <b>Hostname</b>: <%= stream.getHostname() %><br>
          <b>Session ID</b>: <%= request.getParameter("sid") %><br>
          <b>Bot</b>: <%= stream.isBot() ? "Yes" : "No" %><br>
          <b>Stream Start</b>: <%= stream.getStart() %><br>
          <b>Last Request</b>: <%= stream.getLastRequest() %><br>
        
          <% long streamLength = stream.getLastRequest().getTime() - stream.getStart().getTime(); %>
          <b>Session Length</b>:
            <%= (streamLength > 3600000 ?
              " " + (streamLength / 3600000) + " hours" : "") +
            (streamLength > 60000 ?
              " " + ((streamLength / 60000) % 60) + " minutes" : "") +
            (streamLength > 1000 ?
              " " + ((streamLength / 1000) % 60) + " seconds" : "") %><br>
        
          <b># of Requests</b>: <%= stream.getStream().size() %>
        
          <p><b>Click stream</b>:</p>
        
          <table border="0" cellpadding="2">
          <%
          synchronized(stream) {
              Iterator clickstreamIt = stream.getStream().iterator();

              int count = 0;
              while (clickstreamIt.hasNext())
              {
                  count++;
                  String click = ((ClickstreamRequest)clickstreamIt.next()).toString();
              %>
              <tr><td><%= count %>:</td><td><a href="http://<%= click %>"><%= click %></a></td></tr>
              <%
              }
          }
          %>
          </table>
      </body>
</html>



配置

日志功能是非常基本的(你可以与log4j集成 )。如果你需要更多更高级的日志功能,那就需要实现com.opensymphony.clickstream.logger.ClickstreamLogger 接口并且提供任何你所希望的持久化方法。

默认情况下,Clickstream使用com.opensymphony.clickstream.logger.SimpleClickstreamLogger 这个类来处理日志。这个logger只能向Jakarta的Commons Logging 工具发送一个INFO日志声明,Commons Logging可以依次通知多个日志provider,包括log4j

可以通过创建一个clickstream.xml配置文件并且把它放在你应用程序的类路径中(通常是[web应用程序根目录]/WEB-INF/classes)来改变这种默认的行为。配置文件可能是如下的形式:

<clickstream>
      <!-- there can only be one logger -->
      <logger class="com.opensymphony.clickstream.logger.SimpleClickstreamLogger"/>

      <!-- there can be zero or more bot-hosts -->
      <bot-host name="someBotHost"/>

      <!-- there can be zero or more bot-agents -->
      <bot-agent name="someBotAgent"/>
</clickstream>



如果你希望提供你自己的logger,请查看Clickstream 的javadoc文档

和容器有关的特定问题

当从控制台停止Clickstream应用程序时,BEA WebLogic 8.1 (SP2)会抛出NullPointerException异常(when setting the attribute NULL for the clickstreams in the ServletContext on contextDestroyed—这句话不会翻译,谁能帮帮忙 ),需要应用CR133558这个补丁(已经包含在weblogic的sp3中)。

外部文档
使用EAServer跟踪你的用户 —Berndt Hamboeck所著的Sybase白皮书
Servlet2.3 模型的过滤器代码 —Jason Hunter所著的“谁在你的站点上,他们正在干什么”的一段。

by hitdemo2002

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值