过滤器Filter

    Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

    Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。

    Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源(拦截url)进行拦截后,WEB服务器每次在调用web资源之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

    调用目标资源之前,让一段代码执行

    是否调用目标资源(即是否让用户访问web资源)。

    web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。

    调用目标资源之后,让一段代码执行


 想要开发一个过滤器需要如下两个步骤:

    (1)写一个类实现特定的接口Filter

(2)web.xml中注册一下过滤器

 

1、开发Filter对象

生命周期:当服务器启动时,web应用加载后,立即创建这个web应用中的所有的过滤器,过滤器创建出来后立即调用init方法执行初始化的操作.

创建出来后一直驻留在内存中为后续的拦截进行服务.每次拦截到请求后都会导致doFilter方法执行.

在服务器关闭或web应用被移除出容器时,随着web应用的销毁过滤器对象销毁.销毁之前调用destory方法执行善后工作.

 

init方法  (服务器启动web应用加载,立即调用init方法)

   参数FilterConfig:代表web.xml中对当前过滤器的配置信息

      ~获取ServletContext对象

      ~获取初始化信息

                        getInitParameter

                        getInitParameterNames

 doFilter方法

    参数request

    参数response

    参数FilterChain: 代表过滤器链的对象.

         一个资源可能被多个过滤器所拦截到,拦截的顺序为,过滤器在web.xmlfilter-mapping的配置顺序.

        所有对当前资源访问进行拦截的过滤器按照拦截顺序就组成了一个过滤器链.这个过滤器链的最后一个节点是要访问的资源.

        Filter中调用FilterChain提供了doFilter方法,这个方法一旦被调用就表明当前过滤器没有问题了,请执行过滤器链的下一个节点.如果下一个节点是资源则直接执行了资源

destory方法

                    

2、在web.xml中注册一下过滤器

   <filter>

     <filter-name>Demo1Filter</filter-name> -- 给过滤器起一个名字

     <filter-class>com.itheima.filter.Demo1Filter</filter-class> -- 过滤器的处理类

     <init-param>--可以配置当前过滤器的初始化信息,可以配置多个,Filter中利用FilterConfig对象来获取

         <param-name>name1</param-name>

          <param-value>value1</param-value>

       </init-param>

  </filter>

  <filter-mapping> -- 一个Filter可以配置多个filter-mapping

      <filter-name>Demo1Filter</filter-name>

      <url-pattern>/servlet/Demo1Servlet</url-pattern> -- 一个Filtermapping中可以配置多个url-partten,这个url-partten的写法和servlet-mapping中的写法相同

       <url-pattern>/servlet/*</url-pattern>

       <url-pattern>/*</url-pattern>

       <url-pattern>*.do</url-pattern>

       <servlet-name>Demo3Servlet</servlet-name> --也可以配置多个servlet-name,其中填入servlet的名字明确的通知要拦截哪个名字的Servlet

       <dispatcher>REQUEST</dispatcher> --配置拦截哪种方式的对资源的访问可以是REQUEST/FORWARD/INCLUDE/ERROR四个值之中的一个,可以配置多个dispatcher,如果一个都不配则默认是REQUEST

<dispatcher>FORWARD</dispatcher>

 </filter-mapping>

 

 

过滤器根据请求得URL分析确定要拦截什么样得请求。

所谓得拦截就是真正请求资源之前,将代表请求得request对象和代表响应得response对象截获。

从而实现:

在资源执行之前做一些额外的操作

在资源执行之后做一些额外的操作

控制是否允许访问资源

import javax.servlet.Filter;
public class Demo1Filter implements Filter{
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("demo1filter 前");
        chain.doFilter(request, response);
        System.out.println("demo1filter 后");
    }
 }
 
 public class Demo2Filter implements Filter{
    public void doFilter(ServletRequest request, ServletResponse response,
             FilterChain chain) throws IOException, ServletException {
        System.out.println("demo2filter 前");
        chain.doFilter(request, response);
        System.out.println("demo2filter 后");
    }
}

控制台上打印: demo1filter  

demo2filter

资源。。。。

demo2filter

demo1filter

    doFilter拦截请求之后要放行资源,资源放行后,fileter还有再执行一些操作