隨筆 - 154  文章 - 60  trackbacks - 0
          <2007年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          聲明:

          該blog是為了收集資料,認識朋友,學習、提高技術,所以本blog的內容除非聲明,否則一律為轉載??!

          感謝那些公開自己技術成果的高人們?。。?/p> 支持開源,尊重他人的勞動!!

          常用鏈接

          留言簿(3)

          隨筆分類(148)

          隨筆檔案(143)

          收藏夾(2)

          其他

          學習(技術)

          觀察思考(非技術)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          偶得

          看了網上一篇譯文《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應用的所有文件。
          posted on 2007-09-27 11:35 lk 閱讀(367) 評論(0)  編輯  收藏 所屬分類: j2ee
          主站蜘蛛池模板: 遂川县| 收藏| 洱源县| 常宁市| 葫芦岛市| 沾益县| 锡林浩特市| 晴隆县| 游戏| 黄浦区| 本溪市| 普兰店市| 化隆| 屯留县| 连南| 荥经县| 平江县| 虹口区| 阿瓦提县| 册亨县| 宿州市| 青神县| 新民市| 连平县| 奈曼旗| 黄陵县| 石城县| 米泉市| 偏关县| 天峨县| 清水县| 延吉市| 阿坝县| 威宁| 西青区| 顺昌县| 西充县| 原阳县| 襄樊市| 繁昌县| 定陶县|