上一篇说了下servlet,不知道对各位有没有什么帮助,现在说下filter吧。
Filter也是servlet包下的一个接口,中文意思是“过滤器”,其他语言也能时常看到这个单词,它的主要作用就是过滤,对!过滤你想过滤的东西,例如:文件,http请求地址,字符编码等等(在actionScript中filter极易编写,功能也非常强大)。
API地址:http://docs.oracle.com/javaee/5/api/
下面是api中对于filter的介绍
Filters perform filtering in the doFilter method. Every Filter has access to a FilterConfig object from which it can obtain its initialization parameters, a reference to the ServletContext which it can use, for example, to load resources needed for filtering tasks.
Filters are configured in the deployment descriptor of a web application
Examples that have been identified for this design are
1) Authentication Filters
2) Logging and Auditing Filters
3) Image conversion Filters
4) Data compression Filters
5) Encryption Filters
6) Tokenizing Filters
7) Filters that trigger resource access events
8) XSL/T filters
9) Mime-type chain Filter
Since:
Servlet 2.3
从这个介绍可以看出filter是从servlet2.3版本才加入的,用来执行过滤任务的组件,这里值得注意的是filter并不是一个servlet,它会在servlet执行前执行以起到过滤作用。
Api中还列举了下面这些可以过滤的例子,当然不仅仅局限于这些:
2)记录和审计过滤器
3)图像转换过滤器
4)数据压缩过滤器
5)加密过滤器
6)标记化过滤器
7)过滤器,触发资源访问事件
8)XSL/ T过滤器
9)MIME型连锁滤波器
下面分析下filter相关的接口。
Filter接口:filter是servlet包中的一个接口,它其中只有三个方法,doFilter方法最重要,在这个方法里写你的关键代码。
/** * 初始化方法 */ public void init(FilterConfig filterConfig) throws ServletException { } /** * 过滤执行方法,你的代码放在这个方法中 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { } /** * 默认销毁方法 */ public void destroy() { }
FilterChain 接口:中文意思是过滤器调用链,FilterChain 只有一个方法,通过chain. doFilter会调用下一个filter。
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { }
FilterConfig接口:这是filter的相关参数配置接口,可以通过这个接口获取到filter的相关信息,在此就不介绍了。
现在就分析下filter的工作原理和流程:
要弄清filter和servlet的调用流程不如自己建立一个工程,打印些日志就非常明了了。
1.首先建立一个web工程filter_test,然后建立一个servlet起名为TestServlet。
<!-- servlet 配置 --> <servlet> <description>test servlet</description> <display-name>test servlet</display-name> <servlet-name>testServlet</servlet-name> <servlet-class>TestServlet</servlet-class> </servlet> <!-- servlet请求映射配置 --> <servlet-mapping> <servlet-name>testServlet</servlet-name> <url-pattern>/servlet/testServlet</url-pattern> </servlet-mapping>
TestServlet的实现:
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 类描述:测试servlet * @author ming.li<br/> * <a href="http://g21121.iteye.com">iteye bolg</a> * @time 2012-2-2 下午04:10:46 */ public class TestServlet extends HttpServlet { /** * 默认构造方法 */ public TestServlet() { System.out.println("TestServlet:构造方法"); } /** * 默认初始化方法 */ public void init() throws ServletException { System.out.println("TestServlet:初始化方法"); } /** * 默认get请求处理方法 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("TestServlet:get请求处理方法"); response.sendRedirect("http://www.baidu.com/"); } /** * 默认post请求处理方法 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("TestServlet:post请求处理方法"); } /** * 默认销毁方法 */ public void destroy() { System.out.println("TestServlet:销毁方法"); } }
2.然后创建第一个filter。
Filter在web.xml中的配置:
<!-- 第一个filter --> <filter> <description>test fileter for TestServlet 1</description> <filter-class>TestFilter</filter-class> <filter-name>testFilter</filter-name> </filter> <!-- filter映射配置 --> <filter-mapping> <filter-name>testFilter</filter-name> <servlet-name>testServlet</servlet-name> <url-pattern>/servlet/</url-pattern> <!-- dispatcher是servlet2.4才加入的的,这点需要注意一下 --> </filter-mapping>
•在<filter-mapping>配置中,<servlet-name>标签中填写的就是我们要处理的servlet,也就是testServlet,注意这里填写的是servlet-name而不是类名称。
•<url-pattern>标签中填写的就是拦截的请求链接,即在该请求下才调用filter。
•<dispatcher>是在servlet2.4才加入的,里面有
实现filter:
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * 类描述:第一个filter * @author ming.li<br/> * <a href="http://g21121.iteye.com">iteye bolg</a> * @time 2012-2-2 下午04:21:29 */ public class TestFilter implements Filter { /** * 默认初始化方法 */ public void init(FilterConfig fc) throws ServletException { System.out.println("TestFilter:初始化方法"); } /** * 默认处理方法 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("TestFilter:处理方法,doFilter之前"); chain.doFilter(request, response); System.out.println("TestFilter:处理方法,doFilter之后"); } /** * 默认销毁方法 */ public void destroy() { System.out.println("TestFilter:销毁方法"); } }
3.运行项目。
运行过程中我们发现控制台打印了这一句话:TestFilter:初始化方法
说明filter的初始化在启动服务器的时候已经完成了。
然后我们打开浏览器在地址栏里敲入地址:http://localhost:8080/filter_test/servlet/testServlet
控制台打印的信息是:
TestServlet:初始化方法
TestFilter:处理方法,doFilter之前
TestServlet:get请求处理方法
TestFilter:处理方法,doFilter之后
从这个信息打印的顺序我们可以大致分析出filter和servlet的工作流程。
1).servlet的构造方法
2). servlet的初始化方法
3). filter的doFilter方法, chain.doFilter之前的内容
4). servlet对应的请求方法(get post delete put)
5). filter的doFilter方法, chain.doFilter之后的内容
4.此时我再添加一个filter,这个filter同样会处理servlet,看看这两个filter之间有什么联系。
命名另一个filter为OtherTestFilter,web.xml配置为:
<!-- 第二个filter --> <filter> <description>test fileter for TestServlet 2</description> <filter-class>OtherTestFilter</filter-class> <filter-name>otherTestFilter</filter-name> </filter> <!-- filter映射配置 --> <filter-mapping> <filter-name>otherTestFilter</filter-name> <servlet-name>testServlet</servlet-name> <url-pattern>/servlet/</url-pattern> </filter-mapping>
OtherTestFilter实现为:
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * 类描述:第二个测试filter * @author ming.li<br/> * <a href="http://g21121.iteye.com">iteye bolg</a> * @time 2012-2-3 上午10:07:21 */ public class OtherTestFilter implements Filter { /** * 默认初始化方法 */ public void init(FilterConfig fc) throws ServletException { System.out.println("OtherTestFilter:初始化方法"); } /** * 默认处理方法 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("OtherTestFilter:处理方法,doFilter之前"); chain.doFilter(request, response); System.out.println("OtherTestFilter:处理方法,doFilter之后"); } /** * 默认销毁方法 */ public void destroy() { System.out.println("OtherTestFilter:销毁方法"); } }
5.我们依旧打开http://localhost:8080/filter_test/servlet/testServlet
这个地址,看控制台打印日志是什么:
TestServlet:初始化方法
TestFilter:处理方法,doFilter之前
OtherTestFilter:处理方法,doFilter之前
TestServlet:get请求处理方法
OtherTestFilter:处理方法,doFilter之后
TestFilter:处理方法,doFilter之后
结合前面的分析,我们发现如果有多个filter处理同一个servlet的时候,他们的执行顺序如下图
所以经过上面的分析我们不难看出,FilterChain的作用就是以数组形式储存储存要调用的filters,然后在filter中调用chain.doFilter(),执行列表中下一个filter中doFilter()之前代码,以此类推,是不是已经晕了,呵呵。
了解了filter的工作原理和工作流程,我们就能更简单的开发对应的filter了,具体例子,大家可以搜索一下,网上有很多。
相关推荐
### Java中的Filter(过滤器)使用详解 #### 一、Filter概述 在Java Web开发中,`Filter`是一种非常实用的技术,它可以在请求到达目标资源(如Servlet或JSP页面)之前进行预处理,或者在响应返回客户端之前进行后...
Java 中 Filter 的用法 Filter 是 Java servlet 规范中的一种机制,用于对 HTTP 请求和响应进行过滤。Filter 可以实现多种功能,如身份验证、日志记录、缓存控制、字符编码转换等。在 Java 中,Filter 通常用于...
在Java Web开发中,过滤器(Filter)是一个关键组件,它允许开发者在请求到达目标Servlet或JSP之前对其进行处理,以及在响应返回给客户端之前进行修改。`Filter`接口是Servlet API的一部分,位于`javax.servlet`包下...
java中filter跟interceptor区别
利用java filter 实现业务异常拦截 跳转到错误信息提示页面 我们在做项目中肯定都会遇到自定义业务异常 ,然后将业务异常信息跳转的统一的信息提示页面的情况,比如我们在struts的时候我们会用到struts的异常处理...
Java中filter用法完整代码示例 Java中filter用法是指在Java web应用程序中使用filter来实现某些功能,如浏览器不缓存页面、检测用户是否登陆等。filter是一种可以在请求和响应之间执行的过滤器,它可以修改或拦截...
本文将详细探讨Java中Filter和Listener的区别,包括它们的定义、用途、工作原理以及如何在实际应用程序中使用它们。 Filter和Listener是Java Servlet API中两个重要的组件,它们在Web应用程序中扮演着不同的角色。...
通过以上步骤,我们可以实现在Java Web应用中通过Filter来打印请求和响应的数据。这种方法不仅能够帮助我们更好地理解和调试程序逻辑,还能为后续的日志记录和性能分析提供有用的信息。此外,通过对请求和响应的封装...
- **Filter参数**:在`web.xml`中可以通过`init-param`为Filter提供配置参数,以便在Filter中使用。 - **异步Filter**:Java Servlet 3.0及以上版本支持异步Filter,可以在`doFilter`方法中使用异步处理,提高性能。...
在这个"Java-filter测试程序"中,我们可以深入理解Filter的工作原理及其在实际应用中的作用。 Filter在Java Web应用程序中扮演着中间件的角色,它可以对请求进行预处理,也可以对响应进行后处理。例如,我们可以...
综上所述,Java Filter是Java Web开发中的关键组件,理解和熟练使用Filter能极大地增强你的应用程序的功能性和可维护性。通过深入学习和实践,你将能够利用Filter实现各种高效且灵活的解决方案。
Java Filter,也称为Servlet Filter,是Java Web开发中一个重要的组件,主要用来处理HTTP请求和响应。它在Servlet容器(如Tomcat、Jetty)中运行,允许开发者在请求到达目标Servlet或者JSP之前和响应返回客户端之后...
KalmanFilter,KalmanFilter3,KalmanFilter5 一共7种,以上三种实现保证可用,其余待调试,调试函数写好,直接运行即可 KalmanFilter KalmanFilter2 KalmanFilter3 KalmanFilter4 KalmanFilter5 KalmanFilter6 Kalman...
### Java Filter过滤机制详解 #### 一、什么是Filter Filter技术是Servlet 2.3版本中新引入的一个功能,它的主要作用在于对Web应用中的请求和响应进行预处理和后处理。Filter本身并不是一个Servlet,因此它不能...
Java-BloomFilter, 在Java中,一个独立的Bloom过滤器 java-bloomfilterJava bloomfilter是一个独立于Java的Bloom过滤器实现。 它旨在在不需要额外库开销的情况下包含在现有项目中。 第一个版本是由 Ian的博客条目...
本文将深入探讨Java DSP中实现FIR滤波器的相关知识点,结合实验"Java DSP FIR Filter"进行详细解析。 一、FIR滤波器的基本原理 FIR滤波器是一种线性相位滤波器,其输出是输入序列与一组预定义系数的离散时间卷积。...
在Java Web开发中,Filter过滤器是Servlet技术的一部分,用于在请求被Servlet处理之前和之后执行特定的操作。当涉及到处理中文乱码问题时,Filter过滤器扮演着关键角色。中文乱码通常发生在请求数据(如表单提交)在...
**标题解析:** "FIR_Demo_java_dsp_filter_fir_DEMO_" 这个标题表明我们正在讨论一个关于FIR滤波器的Java演示项目。"FIR"代表有限冲击响应滤波器,这是一种数字信号处理技术。"dsp"指的是数字信号处理,"filter"是...
在Java Web开发中,`Filter`是一种重要的组件,主要用于实现请求预处理和响应后处理的功能。它可以在客户端请求到达目标资源(如Servlet、JSP等)之前进行预处理操作,并在响应返回客户端之前进行后处理操作。通过...