JavaWeb——Filter

一、基本概念

之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候,就闲话不絮了。

Filter称之为过滤器,是用来做一些拦截的任务。比如客户端请求服务器的某个资源时(可以是Servlet、JSP、HTML等等),我们可以拦截。当服务器返回资源给客户端的时候,我们也可以拦截。这样我们就可以在调用资源之前和之后分别加入一些业务逻辑。

当我们对某个资源加上多个过滤器的时候,就形成了过滤链。请求(request)会依次通过链上的过滤器,响应(response)会依次以相反的顺序通过过滤器。

二、样例分析

和使用servlet一样,要使用filter只需要两步:1.编写自己的filter,实现javax.servlet.Filter。2.在web.xml中注册该filter。

TestFilter.java

 1 public class TestFilter implements Filter {
 2     public TestFilter() {}
 3
 4     public void init(FilterConfig fConfig) throws ServletException {}
 5
 6     public void destroy() {}
 7
 8     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 9         System.out.println("before doFilter");
10         chain.doFilter(request, response);
11         System.out.println("after doFilter");
12     }
13 }

web.xml

1 <filter>
2     <filter-name>TestFilter</filter-name>
3     <filter-class>com.nantang.filter.TestFilter</filter-class>
4 </filter>
5 <filter-mapping>
6     <filter-name>TestFilter</filter-name>
7     <url-pattern>/test</url-pattern>
8 </filter-mapping>

假定我们在本机部署应用,应用上下文路径是/demo,那么在浏览器里面输入http://localhost:8080/demo/test。则在控制台会输出:"before doFilter"和"after doFilter"。这是我们的请求和响应受到了拦截,在调用具体的Servlet或其他资源前后执行了我们编写的逻辑(例子中就是往控制台打印信息)。

这里需要注意的是,filter可以对url进行过滤,也可以针对具体的servlet进行过滤,只需要制定servlet的名称,如:

1 <filter-mapping>
2     <filter-name>TestFilter</filter-name>
3     <servlet-name>TestServlet</servlet-name>
4 </filter-mapping>

三、源码分析

我们自己编写的filter都需要实现javax.servlet.Filter接口,下面我们看一下Filter接口的继承层级,并逐一分析。

1 FilterConfig

当容器去初始化一个filter的时候,就会根据web.xml文件的配置和当前的运行环境去构造一个FilterCongif实例并传给filter。所以一个filter对应一个FilterConfig实例。

 1 public interface FilterConfig {
 2
 3     public String getFilterName();
 4
 5     public ServletContext getServletContext();
 6
 7     public String getInitParameter(String name);
 8
 9     public Enumeration getInitParameterNames();
10 }

getFilterName方法返回我们在web.xml里面配置的名称。

getServletContext返回ServletContext实例,这个和之前介绍Servlet的时候讲到的是一个东西。一个应用就一个ServletContext实例。

getInitParameter和getInitParameterNames和Servlet的类似。就是获取在web.xml里面配置的初始化参数,如:

 1 <filter>
 2     <filter-name>TestFilter</filter-name>
 3     <filter-class>com.nantang.filter.TestFilter</filter-class>
 4     <init-param>
 5         <param-name>param1</param-name>
 6         <param-value>1</param-value>
 7     </init-param>
 8     <init-param>
 9         <param-name>param2</param-name>
10         <param-value>2</param-value>
11     </init-param>
12 </filter>

2 FilterChain

FilterChain就是我们上面说的过滤链,当请求或响应被filter拦截时,容器提供FilterChain实例给filter让其使用。

1 public interface FilterChain {
2
3     public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;
4 }

FilterChain里面就一个方法doFilter,这个方法就是调用过滤链的下一个filter,如果当前filter是链中最后的一个,则跳转至请求的资源或返回响应给客户端。

3 Filter

Filter里面就三个方法,也就是它的生命周期。和Servlet类似。

1 public interface Filter {
2
3     public void init(FilterConfig filterConfig) throws ServletException;
4
5     public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
6
7     public void destroy();
8 }

3.1 init

filter的初始化方法,跟servlet一样在其生命周期内只会被执行一次。但是filter初始化的时机和servlet不一样,当servlet容器(比如Tomcat)启动完成后就会检索web.xml里面配置的filter,从上往下依次回调每个filter的init方法对其进行初始化。(这里的filterConfig参数是容器构造并传入的。)

3.2 doFilter

实现拦截逻辑的地方,比如一个请求被拦截,这里可以在调用具体资源之前编写一些业务逻辑。然后调用chain.doFilter流转到后置filter,如果当前filter是链中最后的一个,则跳转至请求的资源。当chain.doFilter执行完成后,可以再写一些业务逻辑。然后容器将执行权流转到前置filter,如果当前filter是链中最前的一个,则将响应返回给客户端。(这里的参数chain是容器构造并传入的。)

3.3 destory

和servlet的destroy方法同样的道理,当servlet容器关闭或需要更多内存的时候,会销毁filter。这个方法就使得servlet容器拥有回收资源的能力。

同样地,destroy方法在filter的生命周期中只会被调用一次。

四、总结

到这里filter就算结束了,我们可以发现filter的执行模型和servlet很类似,都是servlet容器在调度。整个生命周期都是容器在管控。

作者:南唐三少
出处:http://www.cnblogs.com/nantang

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我们最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文链接,否则保留追究法律责任的权利。

时间: 2024-10-08 08:49:16

JavaWeb——Filter的相关文章

学习日记:关于javaweb filter中过滤了css文件的解决方法

这是搬运以前的笔记. 在用javaweb做项目时,遇到了filter把css文件等过滤了,导致HTML的布局失效,解决方法是再filter中进行判断,当遇到css文件,png,jpg图片等时,放行.代码如下 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletReques

JAVAWEB Filter使用

Filter学习 1Filter是什么:是过滤器简称 2Filter有什么作用:在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行 包装,再把包装对象传给目标资源,从而实现一些特殊需求. Example: 举一个不恰当的例子:比如当我们喜欢的人电话给我们,我们想手机提供不一样的铃声,  让我来区分是谁打电话给我,这样我就不用拿出手机出来,才知道谁打电话给我 3Filter

Filter的常见应用

1.字符编码过滤器 实现功能,在a.jsp中填写用户名提交到b.jsp,在b.jsp中读取参数名. a.jsp <body> <form action="encoding/b.jsp" method="post"> name:<input type="text" name="username"/> <input type="submit" value="S

JavaWeb监听器和过滤器

JavaWeb监听器 ServletContextListener监听器 Servlet的上下文监听,它主要实现监听ServletContext的创建和销毁.可以完成自己想要的初始化工作.主要包括下面两个方法 //启动服务的时候调用该方法 public void contextInitialized(ServletContextEvent sce); //销毁该服务的时候调用该方法 public void contextDestroyed(ServletContextEvent sce); Se

JavaWeb三大组件之一Filter知识总结

[1] Filter简介    > Filter翻译为中文是过滤器的意思.    > Filter是JavaWeb的三大web组件之一Servlet.Filter.Listener    > Filter的作用是在请求到达WEB资源(HTML.CSS.Servlet.JSP)之前进行拦截.    > Filter需要交给Tomcat访问器来管理    > Filter的作用:        1.Filter可以在请求到达目标资源之前进行拦截        2.Filter也可

JavaWeb:Filter

Filter: 1).what? ①.JavaWeb 的一个重要组件,可以对发送到 Servlet 的请求进行拦截,并对响应也进行拦截. ②.Filter 是实现了 Filter 接口的 Java 类. ③.Filter 需要在 web.xml 文件中进行配置和映射. 2).如何创建一个 Filter ,并把它跑起来. ①.创建一个 Filter 类:实现 Filter 接口  public class HelloFilter implements Filter ②.在 web.xml 文件中配

javaweb学习总结(四十六)——Filter(过滤器)常见应用

一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.Serv

JavaWeb三大组件—过滤器filter

JavaWeb三大组件 1. 都需要在web.xml中进行配置ServletListener(2个感知监听器不需要配置)Filter 2. 过滤器 它会在一组资源(jsp.servlet..css..html等等)的前面执行! 它可以让请求得到目标资源,也可以不让请求达到! * 过滤器有拦截请求的能力! 登录:允许它访问AServlet.BServlet.CServlet ------------------------------- 过滤器如何编写 1. 写一个类实现Filter接口2. 在w

JAVA学习篇--javaweb之Filter详解

在DRP项目中,多次提到了Filter,它解决了字符集的统一设置以及统一控制简单WebCache,从中我们可以体会到,它给我们带来的好处不仅仅是减少代码量这么简单,它的出现避免了我们每个页面重复的编写相同的代码,减少了我们的工作量,而且给维护带来了极大的便利,那么它是如何实现统一管理的呢?既然它能统一管理某些重复的操作,那么它和AOP有什么关系呢? Filter简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过