• Servlet过滤器——过滤器分析流量


    1.概述

         Servlet过滤器可以对用户提交的数据或服务器返回的数据进行更改。任何到达服务器的请求都会首先经过过滤器的处理。本实例应用过滤器的这个特点,编写了一个在过滤器中统计网站流量的实例。

        本实例的设计思路:主体是在过滤器中通过文本文件来存储和读取网站访问量的数据,并且应用自定义变量和session变量防止因页面刷新而导致统计数据不准确。

    首先创建Flux_Data类,通过ReadFile()和WriteFile()方法读取和写入数据;然后创建Filter_flux类,应用Filter统计网站的流量,判断自定义变量和session变量的值是否相同,根据判断结果执行不同的操作。

    2.技术要点

         本实例主要应用Servlet过滤器(Filter),有关Filter接口中提供的方法的详细讲解请参考实例108。

         在doFilter()方法中,应用了synchronized关键字。通过synchronized修饰的方法在执行过程中不会中断(即线程一旦进入synchronized修饰的方法,其他线程就会被阻塞,直到当前线程执行完这个方法为止)。从而避免了在Web系统中多用户访问系统时,出现多用户同时修改变量的值而引发的冲突,导致统计数据的不准确。

         为了确保统计数据的准确性,还应用到一个自定义变量flux和session变量flux,通过判断二者的值,根据判断结果执行不同的操作。

         判断当自定义变量的值等于0时,将自定义变量值加1,并将该值赋给session变量,通过WriteFile()方法将数据0写入到文本文件中。

         判断当自定义变量的值与session变量的值相同时,直接调用ReadFile()方法,读取文本文件中的数据;否则将调用WriteFile()方法将统计的数据加1后重新写入到文本文件中。

    3.具体实现

    (1)首先创建index.jsp文件,输出从Request请求中获取的网站流量的数据。

    (2)编写Flux_Data类,创建ReadFile()方法读取文本文件中存储的数据;创建WriteFile()方法向文本文件中写入数据。其关键代码如下:

    public class Flux_Data {
        private String record = null;                             //保存文本的变量
        private BufferedReader file;                            //BufferedReader对象,用于读取文件数据
        private String path;                                         //文件完整路径
        //ReadFile方法用来读取文件filePath中的数据,并返回这个数据
        public String ReadFile(String filePath) throws FileNotFoundException {
            path = filePath;
            file = new BufferedReader(new FileReader(path));      //创建新的BufferedReader对象
            String result = null;
            try {
                record = file.readLine();                           //读取一行数据并保存到currentRecord变量中
            } catch (IOException e) {                                   //抛出错误
                System.out.println("数据读取失败!");
            }
            if (record == null) {                                 //如果文件为空
                result = "没有任何记录";
            } else {                                                //文件不为空
                result = record;
            }
            return result;                                             //返回读取文件的结果
        }
        //创建WriteFile方法,将数据counter+1后,并将结果重新写入到文本文件filePath中
        public void WriteFile(String filePath, String counter) throws
                FileNotFoundException {
            path = filePath;
            int count = Integer.parseInt(counter) + 1;                //将counter转换为int类型并加一
            try {
                //创建PrintWriter对象,用于写入数据到文件中
                PrintWriter pw = new PrintWriter(new FileOutputStream(filePath));
                pw.println(count);                            //用文本格式打印整数count
                pw.close();                                //清除PrintWriter对象
            } catch (IOException e) {
                System.out.println("文件写入失败" + e.getMessage());
            }
        }
    }

    (3)创建Filter_flux类,应用Filter统计网站的流量,并且将统计的数据通过WriteFile()方法写入到指定的文本文件中,然后通过ReadFile()方法读取出文本文件中的数据,在index.jsp文件中输出流量数据。其关键代码如下:

    public class Filter_flux extends HttpServlet implements Filter {
        private static int flux = 0;                                                       //定义变量
        private String file_path="D:/JavaFlsc/过滤器分析流量/build/web/count.txt";    //定义文本文件的位置   
        public void init(FilterConfig filterConfig) throws ServletException {
        }
        public synchronized void doFilter(ServletRequest request, ServletResponse response,
                FilterChain Chain) throws
                ServletException, IOException {
            HttpSession session = ((HttpServletRequest) request).getSession();
               Flux_Data data=new Flux_Data();                                              //实例化数据的读取和写入的类
             if(flux==0){
                this.flux++;
                session.setAttribute("flux", flux);                            //将flux的值写入到session中
                data.WriteFile(file_path, "0");                                    //调用WriteFile方法,将数据加1
                String count = data.ReadFile(file_path);                            //重新读取数据
                request.setAttribute("count", String.valueOf(count));
            }
            if (flux == session.getAttribute("flux")) {   //判断当flux的值等于session的值时,直接读取记录
                String count = data.ReadFile(file_path);                            //调用ReadFile方法,读取数据
                request.setAttribute("count", String.valueOf(count));
            }else {
                this.flux++;                                                //flux值增加
                session.setAttribute("flux", flux);                            //将flux的值写入到session中
                String counts = data.ReadFile(file_path);                           //读取文本文件中的数据
                data.WriteFile(file_path, counts);                                 //调用WriteFile方法,将数据加1
                String count = data.ReadFile(file_path);                            //重新读取数据
                request.setAttribute("count", String.valueOf(count));
            }
            Chain.doFilter(request, response);
        }
        public void destroy() {
        }
    }

    (4)最后在web.xml文件中配置Filter_flux类。完成过滤器的初始化操作。首先通过<filter></filter>标签配置Servlet过滤器名称和所在包的类名,然后再通过<filter-mapping> </filter-mapping>标签配置Servlet过滤器的映射路径,其关键代码如下:

    <filter>
          <!—servlet过滤器的名称 -->
             <filter-name>Filter_flux</filter-name>
       <!—servlet过滤器的包所在类名称-->
          <filter-class>com.pkh.Filter_flux</filter-class>
    </filter>
         <filter-mapping>
                <!--要映射的servlet过滤器名称-->
                <filter-name>Filter_flux</filter-name>
                <!--要映射的servlet过滤器映射的范围--> 
                <url-pattern>/ *</url-pattern>
               <dispatcher>REQUEST</dispatcher>
               <dispatcher>FORWARD</dispatcher>
        </filter-mapping>
     
  • 相关阅读:
    python 网页爬虫,下载网络图片
    J2SE 8的泛型
    简历上的项目经历怎么写?这3条原则不可忽视!
    看过太多大厂面试题,其实考的无非是这 3 点能力
    宁可多花1000元租房,也绝不要去挤半小时地铁
    光背面试题可没用,谈谈如何真正掌握一个技术知识点
    为了学好Java,我尝试了这 6 个方法
    springmvc之处理模型数据SessionAttributes注解
    springmvc之处理模型数据Map
    springmvc之处理模型数据ModelAndView
  • 原文地址:https://www.cnblogs.com/zkn11199/p/5600387.html
Copyright © 2020-2023  润新知