<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
    主站蜘蛛池模板: 波多野结衣在线免费视频| 国产成人精品免费视| 亚洲国产精品无码久久青草| 亚洲综合一区国产精品| 色播精品免费小视频| 亚洲韩国在线一卡二卡| 3d成人免费动漫在线观看| 亚洲的天堂av无码| 2022年亚洲午夜一区二区福利 | 日本一线a视频免费观看| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 国产精品V亚洲精品V日韩精品| 久久亚洲国产视频| 亚洲AV无码国产精品永久一区| 4444www免费看| 一本久久a久久精品亚洲| 亚洲人成77777在线播放网站不卡| 国产精品免费久久久久影院| 91视频国产免费| 亚洲人成网站18禁止| 免费人成激情视频| 国产精品免费视频观看拍拍| 亚洲国产成人私人影院| 国产VA免费精品高清在线| 国产精品酒店视频免费看| 一区二区三区AV高清免费波多| 毛片免费在线观看网址| 免费无码国产在线观国内自拍中文字幕| 18未年禁止免费观看| 亚洲国产精品免费观看| 国产一卡2卡3卡4卡无卡免费视频 国产一卡二卡3卡四卡免费 | 亚洲成人免费网站| 在线免费观看一区二区三区| 99ri精品国产亚洲| 国产又黄又爽又猛的免费视频播放 | 亚洲精品无码久久久久APP | 亚洲国产成a人v在线观看| 午夜毛片不卡高清免费| 免费人成激情视频在线观看冫| 亚洲精品尤物yw在线影院| 色欲色香天天天综合网站免费|