「Servlet 2.3フィルタプログラミング」について

10132 ワード

「Servlet 2.3フィルタプログラミング」(転)について
偶然
ネット上の訳文を見ました.「Servlet 2.3フィルタプログラミング」の原文「Filter code with Servlet 2.3 model」はhttp://www.javawold.com/.中で4つの例を話しましたが、三つの意味があります.詳しく見ていません.
   このフィルタの例は、ユーザ要求を追跡して、彼女のウェブサイト上で誰が、各ユーザがそのページにアクセスしているかをネットワーク管理者に報告するものである.テスト結果図は以下の通りです.
一、web.xmlファイル>

       これはClickstream Filterを登録して、*.jspと*.を処理するように設定してください.これはまた、Clickstream Loggarをアプリケーションイベントが発生した時に彼らを受け入れるモニターとして登録します.
二、Servlet Contect Listenerであり、HttpSession ListenerモニターClickstream Logger類でもあります.
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:
" + 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 Clickstream Filter implements Filter{
  protected FilterConfig filterConfig;
  prvate final static String FILTRERUAPPLIED=「clickstream ufilterapplied」
 
  public void init(FilterConfig config)throws Servlet Exception{
    this.filterConfig=filterConfig;
  }
 
  public void doFilter(Servlet Request request、Servlet Resonse)
                   FilterCharin chain)throws IOException、Servlet Exception{
   //このフィルタは要求毎に一回だけ使用されることを確認します.
    if(request.getAttribute(FILTER UAPPLIED)==null){
      request.set Attribute(FILTERUAPPLIED、Boolean.TRUE)
      HttpSession session=(HttpServletRequest)request.getSession()
      Clickstream stream=(Clickstream)session.get Attribute("clickstream")
      stream.addRequest;
    }
 
   //要求を伝達する
    chain.doFilter(request、reponse);
  }
 
  public void destroy(){}
)
 
ドFilter()メソッドは、ユーザのsessionを取得し、Clickstreamを取得し、Clikstreamに現在の要求データを追加します.このフィルタが現在要求されて使用されているかどうかを示す特別なFILTER_uAPPLIEDタグ属性を使用して、他のフィルタのすべての行為を無視します.


、 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 + "
");
output.append("Session ID: " + (session != null ? session.getId() + "" : "") + "
");
output.append("Initial Referrer: " + initialReferrer + "
");
output.append("Stream started: " + start + "
");
output.append("Last request: " + lastRequest + "
");

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" : "") +
"
");

Iterator clickstreamIt = clickstream.iterator();

int count = 0;
while (clickstreamIt.hasNext())
{
count++;

output.append(count + ": " + clickstreamIt.next() + "
");
}

return output.toString();
}
}
、ロボットですか?
Bot Checkerクラスは、クライアントがロボットかどうかを するために されます.
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 。