<%@ page contentType="text/html; charset=gb2312"%> 他们在你的网站上做什么?
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
他们在你的网站上做什么?
     发布者: 发布时间:2006-10-26
   看了网上一篇译文《Servlet 2.3 过滤器编程》原文 《Filter code with Servlet 2.3 model 》出自http://www.javawold.com/。里面讲了四个例子,有三个意思不大,没有仔细看。
   下面这个过滤器示例跟踪用户请求,向网络管理员报告谁在她的网站上以及每个用户正在访问那个页面。测试结果图如下:



一、web.xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

<web-app>
<!-- CLICKSTREAM LOGGER -->
<filter>
  <filter-name>clickstreamFilter</filter-name>
  <filter-class>com.java3z.examples.ClickstreamFilter</filter-class>
</filter>

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

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

<listener>
  <listener-class>com.java3z.examples.ClickstreamLogger</listener-class>
</listener>
<!-- END CLICKSTREAM LOGGER -->

</web-app>
       这注册了ClickstreamFilter并设置其处理*.jsp和*.html来的请求。这也将ClickstreamLogger注册为一个监听器以在应用事件发生时接受他们。

二、既是ServletContextListener又是 HttpSessionListener监听器ClickstreamLogger类

package com.java3z.examples;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ClickstreamLogger implements ServletContextListener, HttpSessionListener
{
	Map clickstreams = new HashMap();
	
	public ClickstreamLogger() 
	{
		// System.out.println("ClickstreamLogger constructed");
	}

	public void contextInitialized(ServletContextEvent sce)
	{
		// System.out.println("ServletContext Initialised");
		
		sce.getServletContext().setAttribute("clickstreams", clickstreams);
	}

	public void contextDestroyed(ServletContextEvent sce)
	{
		sce.getServletContext().setAttribute("clickstreams", null);
		// System.out.println("ServletContext Destroyed");
	}	

	public void sessionCreated(HttpSessionEvent hse)
	{
		// System.out.println("Session Created");
		HttpSession session = hse.getSession();
		
		Clickstream clickstream = new Clickstream();
		session.setAttribute("clickstream", clickstream);

		clickstreams.put(session.getId(), clickstream);
	}

	public void sessionDestroyed(HttpSessionEvent hse)
	{
		// System.out.println("Session Destroyed");
		
		HttpSession session = hse.getSession();
		
		Clickstream stream = (Clickstream)session.getAttribute("clickstream");

		clickstreams.remove(session.getId());
		
		System.out.println("Final session clickstream:\n" + stream);
	}
}

ClickstreamLogger类在servlet环境创建时设置全局属性getServletContext.setAttribute("clickstreams", clickstreams),一个
Map,在用户访问网站时设置会话属性session.setAttribute("clickstream", clickstream),并将可记录会话数据的对象clickstream
放入Map,以便在JSP页面中输出网站访问者的信息。 三、过滤器ClickstreamFilter类

     package com.java3z.examples;

import java.io.IOException;

import javax.servlet.*;

import javax.servlet.http.*;

 

public class ClickstreamFilter implements Filter {

  protected FilterConfig filterConfig;

  private final static String FILTER_APPLIED = "_clickstream_filter_applied";

 

  public void init(FilterConfig config) throws ServletException {

    this.filterConfig = filterConfig;

  }

 

  public void doFilter(ServletRequest request, ServletResponse response,

                   FilterChain chain) throws IOException, ServletException {

    // 确保该过滤器在每次请求中只被使用一次

    if (request.getAttribute(FILTER_APPLIED) == null) {

      request.setAttribute(FILTER_APPLIED, Boolean.TRUE);

      HttpSession session = ((HttpServletRequest)request).getSession();

      Clickstream stream = (Clickstream)session.getAttribute("clickstream");

      stream.addRequest(((HttpServletRequest)request));

    }

 

    // 传递请求

    chain.doFilter(request, response);

  }

 

  public void destroy() { }

}

 

doFilter()方法取得用户的session,从中获取Clickstream,并将当前请求数据加到Clickstream中。其中使用了一个特殊的FILTER_APPLIED标记属性来标注此过滤器是否已经被当前请求使用(可能会在请求调度中发生)并且忽略所有其他的过滤器行为。



四、保存请求数据的Clickstream类
package com.java3z.examples;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Clickstream implements Serializable
{
	List clickstream = new ArrayList();
	String hostname = null;
	HttpSession session = null;
	String initialReferrer = null;
	Date start = new Date();
	Date lastRequest = new Date();
	boolean bot = false;//是否是机器人访问
	
	public Clickstream()
	{
	}

	public void addRequest(HttpServletRequest request)
	{
		lastRequest = new Date();
		
		if (hostname == null) {
			hostname = request.getRemoteHost();
			session = request.getSession();	
		}
			
		// if this is the first request in the click stream
		if (clickstream.size() == 0)
		{
			// setup initial referrer
			if (request.getHeader("REFERER") != null)
			{
				initialReferrer = request.getHeader("REFERER");
			}
			else
			{
				initialReferrer = "";
			}

			// decide whether this is a bot
			bot = BotChecker.isBot(request, this);
		}
		
		clickstream.add(request.getServerName() + 
			(request.getServerPort() != 80 ? ":" + request.getServerPort() : "") +
			request.getRequestURI() + 
			(request.getQueryString() != null ? "?" + request.getQueryString() : ""));

		// System.out.println(this.toString());
	}

	public String getHostname()
	{
		return hostname;
	}

	public boolean isBot()
	{
		return bot;
	}

	public void setBot(boolean value)
	{
		this.bot = value;
	}
	
	public HttpSession getSession()
	{
		return session;
	}

	public String getInitialReferrer()
	{
		return initialReferrer;
	}

	public Date getStart()
	{
		return start;
	}

	public Date getLastRequest()
	{
		return lastRequest;
	}

	public List getStream()
	{
		return clickstream;
	}
	
	public String toString()
	{
		StringBuffer output = new StringBuffer();
		
		output.append("Clickstream for: " + hostname + "\n"); 
		output.append("Session ID: " + (session != null ? session.getId() + "" : "") + "\n"); 
		output.append("Initial Referrer: " + initialReferrer + "\n");
		output.append("Stream started: " + start + "\n");
		output.append("Last request: " + lastRequest + "\n");
		
		long streamLength = lastRequest.getTime() - start.getTime();
		
		output.append("Stream length:" + 
			(streamLength > 3600000 ?
				" " + (streamLength / 3600000) + " hours" : "") +
			(streamLength > 60000 ?
				" " + ((streamLength / 60000) % 60) + " minutes" : "") +
			(streamLength > 1000 ?
				" " + ((streamLength / 1000) % 60) + " seconds" : "") +
			"\n");

		Iterator clickstreamIt = clickstream.iterator();

		int count = 0;
		while (clickstreamIt.hasNext())
		{
			count++;
			
			output.append(count + ": " + clickstreamIt.next() + "\n");
		}

		return output.toString();
	}
}
五、是机器人吗?
BotChecker类用来确定客户端是否是一个机器人。
package com.java3z.examples;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class BotChecker 
{
	public static String[] botHosts = {"inktomi.com", "inktomisearch.com", "googlebot.com", "linuxtoday.com.au"};
	
	public static boolean isBot(HttpServletRequest request, Clickstream stream)
	{
		String requestURI = request.getRequestURI();
		
		// if it requested robots.txt, it's a bot
		if (requestURI.indexOf("robots.txt") >= 0)
		{
			return true;
		}

		// it requested a RSS feed from our backend, it's a bot
		if (requestURI.indexOf("/backend/") >= 0)
		{
			return true;
		}
		
		for (int i = 0; i < botHosts.length; i++)
		{
			if (request.getRemoteHost().indexOf(botHosts[i]) >= 0)
			{
				return true;
			}
		}

		return false;
	}
}

六、测试:请下载测试这个WEB应用的所有文件。
(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
Cookie手册
用JAVA写一个日志类程序
审查Java代码的十一种常见错误
JAVA基础:谨慎使用Date和Time类
简单级联菜单(javascript实现)
JAR 文件揭密
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(2609)
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(1734)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(7722)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(8378)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号