---Filter(一)简介

来源:互联网 发布:数据库中级工程师证书 编辑:程序博客网 时间:2024/05/16 12:13

Filter简介

OneFilter.java

package com.tuxianchao.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 *  * 1.Filter是java web中一个重要的组件,Filter能够对servlet容器的请求和响应进行拦截和修改 *  * 2.Filter本身不产生任何请求相应的对象,他只能对servlet容器的请求响应提供过滤功能,在请求到达目标(servlet,jsp) * 前拦截检查request,修改request;在目标资源返回客户端浏览器的时候进行拦截检查response对象,修改response对象。 *  * 3.servlet可以过滤的可以是servlet,jsp,html。 *  *  * Filter接口 *  * Filter和Servlet接口类似, 提供了destroy(),doFilter(ServletRequest request, * ServletResponse response, FilterChain chain),init(FilterConfig * filterConfig)方法 *              >init(FilterConfig filterConfig) *              Filter和servlet的生命周期类似,当servlet启动的时候,创建加载Filter实例,由servlet容器调用filter *              的init方法。并且传入一个FilterConfig filterConfig参数,该对象包含filter的配置信息(在web.xml配置的初始化参数,filter-name,getServletContext等) *   *              >destory() *              当servlet容器卸载当前web应用的时候由servlet来调用这个方法,调用这个方法             *              >doFilter(ServletRequest request, ServletResponse response, FilterChain *              chain) *              doFilter才是真正过滤的逻辑代码部分,这个方法中requestresponse参数就是封装了请求响应信息的参数 *              可以在过滤器中检查,修改请求响应的信息;filterchain参数用于访问后续的过滤器,chain.doFilter(request, response); *              将请求传给下一级过滤器,(FilterChain是一个过滤器的链,其链的顺序和在web.xml中映射filter-mapping的顺序有关)。 * 编写一个Filter步骤: * 1.只需要实现java.servlet.filter接口中对应的方法即可。 * 2.在web.xml文件中配置filter: *          <filter>标签用来定义一个过滤器 *                  <filter-name>   filter的名字 *                  <filter-class> filter全类名 *                  <init-param> 为过滤器提供初始化参数。可有多个 *          <filter-mapping>标签用来定义一个过滤器 *                  <filter-name>   filter的名字 *                  <url-pattern> 指定和filter关联的URL,为”/*”表示所有URL(这里有两层含义,我的可以理解是 *                      一方面对客户浏览器来说,是访问filter的地址,从servlet容器或者web应用来说,它制指定了该过滤器过滤的资源) *  *  */public class OneFilter implements Filter {    public void destroy() {        System.out.println("destory......");    }    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        chain.doFilter(request, response);        System.out.println("dofilter...");    }    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("init...");    }}

Filter和Filter链

可以是一个Filter过滤一个目标和多个Filter过滤一个目标

下列是多个Filter时候filter中都filter在请求响应的时候执行的顺序:
OneFilter.java

package com.tuxianchao.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;public class OneFilter implements Filter {    public void destroy() {    }    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        System.out.println("1.Before OneFilter's dofilter");        chain.doFilter(request, response);        System.out.println("2.After OneFilter's dofilter");    }    public void init(FilterConfig filterConfig) throws ServletException {    }}

SecondFilter.java

package com.tuxianchao.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;public class SecondFilter implements Filter {    public void destroy() {    }    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        System.out.println("3.Before SecondFilter's dofilter");        chain.doFilter(request, response);        System.out.println("4.After SecondFilter's dofilter");    }    public void init(FilterConfig filterConfig) throws ServletException {    }}

web.xml中配置的顺序:

<!--配置Filter -->    <filter>        <filter-name>OneFilter</filter-name>        <filter-class>com.tuxianchao.filter.OneFilter</filter-class>    </filter>    <filter>        <filter-name>SecondFilter</filter-name>        <filter-class>com.tuxianchao.filter.SecondFilter</filter-class>    </filter>    <!-- Filterchain的顺序和filter-mapping的顺序一致 -->    <filter-mapping>        <filter-name>OneFilter</filter-name>        <url-pattern>/a.jsp</url-pattern>    </filter-mapping>    <filter-mapping>        <filter-name>SecondFilter</filter-name>        <url-pattern>/a.jsp</url-pattern>    </filter-mapping>

执行结果:
Console输出:

1.Before OneFilter's dofilter3.Before SecondFilter's dofilter5.jsp page4.After SecondFilter's dofilter2.After OneFilter's dofilter

在本例子中,在index.jap由一个超链接跳转到a.jsp中,对目标资源a.jsp创建了两个filter (OneFilter和SecondFilter),在执行的时候,进入第一个过滤器(OneFilter)后执行相应的代码,当执行到chain.doFilter(reqquest,response)的时候,过滤器放行转而进入下一个过滤器,以此类推,在执行完最后一个过滤器成功请求到目标页面的时候,会执行最后一个Filter的doFilter方法后的代码,然后返回到上一个filter的doFilter后的代码,最后一直到第一个Filter。

这里写图片描述

由上图可以看出,在请求和响应的时候,在filter中的doFilter方法的前后分别是请求和相应的执行顺序,也就是说,在doFilter方法前可以对请求信息拦截检查修改再确定时候放行,在doFilter方法后可以对响应信息进行修改。

0 0
原创粉丝点击