Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 431|回复: 0

[servlet学习]他们在你的网站上做什么?

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 00:56:18 | 显示全部楼层 |阅读模式
    看了网上一篇译文《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类

                            function TempSave(ElementID)
                            {
                                    CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value);
                                    CommentsPersistDiv.save("CommentXMLStore");
                            }
                            function Restore(ElementID)
                            {
                                    CommentsPersistDiv.load("CommentXMLStore");
                                    document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent");
                            }
                   
                      








       
    1. package com.java3z.examples;
    2. import java.util.*;
    3. import javax.servlet.*;
    4. import javax.servlet.http.*;
    5. public class ClickstreamLogger implements ServletContextListener, HttpSessionListener
    6. {
    7.         Map clickstreams = new HashMap();
    8.        
    9.         public ClickstreamLogger()
    10.         {
    11.                 // System.out.println("ClickstreamLogger constructed");
    12.         }
    13.         public void contextInitialized(ServletContextEvent sce)
    14.         {
    15.                 // System.out.println("ServletContext Initialised");
    16.                
    17.                 sce.getServletContext().setAttribute("clickstreams", clickstreams);
    18.         }
    19.         public void contextDestroyed(ServletContextEvent sce)
    20.         {
    21.                 sce.getServletContext().setAttribute("clickstreams", null);
    22.                 // System.out.println("ServletContext Destroyed");
    23.         }       
    24.         public void sessionCreated(HttpSessionEvent hse)
    25.         {
    26.                 // System.out.println("Session Created");
    27.                 HttpSession session = hse.getSession();
    28.                
    29.                 Clickstream clickstream = new Clickstream();
    30.                 session.setAttribute("clickstream", clickstream);
    31.                 clickstreams.put(session.getId(), clickstream);
    32.         }
    33.         public void sessionDestroyed(HttpSessionEvent hse)
    34.         {
    35.                 // System.out.println("Session Destroyed");
    36.                
    37.                 HttpSession session = hse.getSession();
    38.                
    39.                 Clickstream stream = (Clickstream)session.getAttribute("clickstream");
    40.                 clickstreams.remove(session.getId());
    41.                
    42.                 System.out.println("Final session clickstream:
    43. " + stream);
    44.         }
    45. }
    46. ClickstreamLogger类在servlet环境创建时设置全局属性getServletContext.setAttribute("clickstreams", clickstreams),一个
    47. Map,在用户访问网站时设置会话属性session.setAttribute("clickstream", clickstream),并将可记录会话数据的对象clickstream
    48. 放入Map,以便在JSP页面中输出网站访问者的信息。
    49. 三、过滤器ClickstreamFilter类
    复制代码

    1.      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标记属性来标注此过滤器是否已经被当前请求使用(可能会在请求调度中发生)并且忽略所有其他的过滤器行为。
       
    1. 四、保存请求数据的Clickstream类
    复制代码
    1. package com.java3z.examples;
    2. import java.util.*;
    3. import java.io.*;
    4. import javax.servlet.*;
    5. import javax.servlet.http.*;
    6. public class Clickstream implements Serializable
    7. {
    8.         List clickstream = new ArrayList();
    9.         String hostname = null;
    10.         HttpSession session = null;
    11.         String initialReferrer = null;
    12.         Date start = new Date();
    13.         Date lastRequest = new Date();
    14.         boolean bot = false;//是否是机器人访问
    15.        
    16.         public Clickstream()
    17.         {
    18.         }
    19.         public void addRequest(HttpServletRequest request)
    20.         {
    21.                 lastRequest = new Date();
    22.                
    23.                 if (hostname == null) {
    24.                         hostname = request.getRemoteHost();
    25.                         session = request.getSession();       
    26.                 }
    27.                        
    28.                 // if this is the first request in the click stream
    29.                 if (clickstream.size() == 0)
    30.                 {
    31.                         // setup initial referrer
    32.                         if (request.getHeader("REFERER") != null)
    33.                         {
    34.                                 initialReferrer = request.getHeader("REFERER");
    35.                         }
    36.                         else
    37.                         {
    38.                                 initialReferrer = "";
    39.                         }
    40.                         // decide whether this is a bot
    41.                         bot = BotChecker.isBot(request, this);
    42.                 }
    43.                
    44.                 clickstream.add(request.getServerName() +
    45.                         (request.getServerPort() != 80 ? ":" + request.getServerPort() : "") +
    46.                         request.getRequestURI() +
    47.                         (request.getQueryString() != null ? "?" + request.getQueryString() : ""));
    48.                 // System.out.println(this.toString());
    49.         }
    50.         public String getHostname()
    51.         {
    52.                 return hostname;
    53.         }
    54.         public boolean isBot()
    55.         {
    56.                 return bot;
    57.         }
    58.         public void setBot(boolean value)
    59.         {
    60.                 this.bot = value;
    61.         }
    62.        
    63.         public HttpSession getSession()
    64.         {
    65.                 return session;
    66.         }
    67.         public String getInitialReferrer()
    68.         {
    69.                 return initialReferrer;
    70.         }
    71.         public Date getStart()
    72.         {
    73.                 return start;
    74.         }
    75.         public Date getLastRequest()
    76.         {
    77.                 return lastRequest;
    78.         }
    79.         public List getStream()
    80.         {
    81.                 return clickstream;
    82.         }
    83.        
    84.         public String toString()
    85.         {
    86.                 StringBuffer output = new StringBuffer();
    87.                
    88.                 output.append("Clickstream for: " + hostname + "
    89. ");
    90.                 output.append("Session ID: " + (session != null ? session.getId() + "" : "") + "
    91. ");
    92.                 output.append("Initial Referrer: " + initialReferrer + "
    93. ");
    94.                 output.append("Stream started: " + start + "
    95. ");
    96.                 output.append("Last request: " + lastRequest + "
    97. ");
    98.                
    99.                 long streamLength = lastRequest.getTime() - start.getTime();
    100.                
    101.                 output.append("Stream length:" +
    102.                         (streamLength > 3600000 ?
    103.                                 " " + (streamLength / 3600000) + " hours" : "") +
    104.                         (streamLength > 60000 ?
    105.                                 " " + ((streamLength / 60000) % 60) + " minutes" : "") +
    106.                         (streamLength > 1000 ?
    107.                                 " " + ((streamLength / 1000) % 60) + " seconds" : "") +
    108.                         "
    109. ");
    110.                 Iterator clickstreamIt = clickstream.iterator();
    111.                 int count = 0;
    112.                 while (clickstreamIt.hasNext())
    113.                 {
    114.                         count++;
    115.                        
    116.                         output.append(count + ": " + clickstreamIt.next() + "
    117. ");
    118.                 }
    119.                 return output.toString();
    120.         }
    121. }
    复制代码
    五、是机器人吗?
    BotChecker类用来确定客户端是否是一个机器人。
    1. package com.java3z.examples;
    2. import java.util.*;
    3. import java.io.*;
    4. import javax.servlet.*;
    5. import javax.servlet.http.*;
    6. public class BotChecker
    7. {
    8.         public static String[] botHosts = {"inktomi.com", "inktomisearch.com", "googlebot.com", "linuxtoday.com.au"};
    9.        
    10.         public static boolean isBot(HttpServletRequest request, Clickstream stream)
    11.         {
    12.                 String requestURI = request.getRequestURI();
    13.                
    14.                 // if it requested robots.txt, it"s a bot
    15.                 if (requestURI.indexOf("robots.txt") >= 0)
    16.                 {
    17.                         return true;
    18.                 }
    19.                 // it requested a RSS feed from our backend, it"s a bot
    20.                 if (requestURI.indexOf("/backend/") >= 0)
    21.                 {
    22.                         return true;
    23.                 }
    24.                
    25.                 for (int i = 0; i < botHosts.length; i++)
    26.                 {
    27.                         if (request.getRemoteHost().indexOf(botHosts[i]) >= 0)
    28.                         {
    29.                                 return true;
    30.                         }
    31.                 }
    32.                 return false;
    33.         }
    34. }
    35. 六、测试:请下载测试这个WEB应用的所有文件
    复制代码

      
       
       
         
         

          
         

          
         
       
      
    复制代码



    源码下载:http://file.javaxxz.com/2014/10/10/005618593.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-16 09:54 , Processed in 0.461545 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表