<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    聲明:

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

    感謝那些公開自己技術成果的高人們!!!

    支持開源,尊重他人的勞動!!

    常用鏈接

    留言簿(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 閱讀(364) 評論(0)  編輯  收藏 所屬分類: j2ee
    主站蜘蛛池模板: 97在线线免费观看视频在线观看| 成年黄网站色大免费全看| 免费人妻无码不卡中文字幕18禁| 91嫩草亚洲精品| 国产91色综合久久免费| 亚洲AV一二三区成人影片| 国产精品久久久久久久久久免费 | 在线观看成人免费视频不卡| 亚洲精品人成在线观看| 毛片无码免费无码播放| 亚洲xxxx18| 国产精品二区三区免费播放心| 亚洲日韩在线中文字幕综合 | 女人18毛片水真多免费看| 亚洲乱码无限2021芒果| 在线免费观看一级片| 亚洲av无码兔费综合| 亚洲精品国产福利一二区| 中文字幕在线免费播放| 亚洲丝袜美腿视频| 国内精品乱码卡1卡2卡3免费| 亚洲AV无码一区二区三区网址| 亚洲人成电影在线播放| 男人都懂www深夜免费网站| 亚洲欧洲日韩国产| 日本免费一二区在线电影| 国产精品免费在线播放| 在线观看亚洲一区二区| 最新中文字幕电影免费观看| 日韩在线视频免费| 久久综合日韩亚洲精品色| 最近免费中文字幕4| yy一级毛片免费视频| 亚洲国产精品成人精品小说| 国产在线不卡免费播放| 午夜理伦剧场免费| AV激情亚洲男人的天堂国语| 亚洲情a成黄在线观看动漫尤物| 中字幕视频在线永久在线观看免费| 日韩在线一区二区三区免费视频 | 亚洲成年人电影网站|