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>

Servlet过滤器——过滤器分析流量的更多相关文章

  1. 面试之servlet、过滤器、监听器

    servlet.过滤器.监听器servlet是Java中WEB请求和响应的容器servlet的运行需要在类似tomcat容器中,一个 Web 应用对应一个 Context 容器,也就是 Servlet ...

  2. Servlet的过滤器Filter

    Servlet 编写过滤器 Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Serv ...

  3. javaWeb中servlet开发——过滤器

    servlet开发--过滤器(filter) servlet有三种,分为简单servlet.过滤器servlet.监听servlet 简单servlet是作为一种程序所必须的开发结构保存的,继承htt ...

  4. Servlet之过滤器(Filter)和监听器(Listener)

    过滤器 过滤器是一个java组件,可以拦截发送至某个servelet,jsp页面或静态页面的请求,可以在响应发送到客户之前进行拦截 工作原理: 过滤器类必须实现 Filter 接口,包含的方法如下: ...

  5. STM32之CAN通讯接收过滤器过滤分析

    一.前言 学习了CAN通讯,底层的东东CAN控制器已经帮你处理完成,也就是CAN通讯协议已经做好,你按协议格式往对应的位扔数据发送就好,所以使用CAN通讯,我们只需要去关心制定发送的数据间的协议,也就 ...

  6. java过滤器(过滤器排序)

    java过滤器(过滤器排序) 定义过滤器顺序是很简单的:匹配请求的过滤器将按照它们出现在部署描述符或者编程式配置中的顺序添加到过滤器链中(记住,如果同时再部署描述符或者编程式配置中设置了一些过滤器,那 ...

  7. MapReduce分析流量汇总

    一.MapReduce编程规范 一.MapReduce编程规范 用户编写mr程序主要分为三个部分:Mapper,Reducer,Driver 1.Mapper阶段 (1)用户自定义Mapper类 要继 ...

  8. 动手学servlet(六) 过滤器和监听器

     过滤器(Filter) 过滤器是在客户端和请求资源之间,起一个过滤的作用,举个例子,比如我们要请求admin文件夹下的index.jsp这个页面,那么我们可以用一个过滤器,判断登录用户是不是管理员 ...

  9. java servlet之过滤器1(解决jsp之间POST方式数据传递乱码)

    首先,看看没有解决乱码的效果,新建两个jsp页面(a.jsp跳转到b.jsp). <form action="b.jsp" method="post"&g ...

随机推荐

  1. iOS开发笔记--使用blend改变图片颜色

    最近对Core Animation和Core Graphics的内容东西比较感兴趣,自己之前也在这块相对薄弱,趁此机会也想补习一下这块的内容,所以之后几篇可能都会是对CA和CG学习的记录的文章. 在应 ...

  2. 安卓Launcher之获取手机安装的应用列表,安卓launcher

    Launcher中最主要的就是获取所有应用列表的入口以及图标,一般获取的方法有两种: PackageInfo ResolveInfo 运行获取所有APP的Launcher并且允许进行点击事件,进入到应 ...

  3. matrix(dp)

    matrix Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  4. ASP.NET页面之间传值

    介绍: 在网页应用程序的开发中,页面之间的传值应该是最常见的问题了. 在这篇文章里,azamsharp 将为我们介绍一些ASP.NET页面传值的方式.本文所举的例子非常简单,仅仅包含了一个文本框和几个 ...

  5. VC6.0 导入资源崩溃

    等我以后挣钱了一定买正版! 最近学习Win32编程,为了锻炼自己,在网上下载了一个VC6.0作为开发工具,应该是兼容性的问题吧,VC6 经常闹毛病. 今天导入资源的时候VC6出现崩溃的现象. 马上寻求 ...

  6. 不可表示的数[x/2] + y + x * y

    前端是时间在庞果网上看到不可表示的数的编程题(如下),我自己也试着解答了一下,写的算法虽然没有没有错,但是跑了一些还只是跑到a8,后来到自己整理一下网上的解答过程,虽然解答写的很清晰,但是有些知识还是 ...

  7. NEC协议

    注意: 用示波器在接收头抓的电平看起来和NEC协议刚好相反, 那是因为:HS0038B 这个红外一体化接收头,当收到有载波的信号的时候,会输出一个低电平,空闲的时候会输出高电平. 具体情况,具体分析. ...

  8. c语言,结构体

    数据类型分为4种, 简单数据类型,构造数据类型,指针数据类型,空类型. 结构体属于构造数据类型,用struct标识. 声明一个结构体: Typedef  struct和struct c c++ typ ...

  9. WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制

    原文:WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制 和传统的分布式远程调用一样,WCF的服务调用借助于服务代理(Service ...

  10. Ubuntu 挂载ISO文件的方法

    1.在终端中输入:sudo mkdir /media/iso 在/media下生成一个iso文件夹用来挂载iso文件2.然后输入:sudo mount -o loop /home/X/X/XXXX.i ...