Filter过滤器(详细使用方法)

Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。
当然,我们使用过滤器也是为了处理访问Servlet的数据。

首先我们来看一下Filter的用法。

    1.创建一个类实现Filter接口
    2.重写接口中方法  doFilter方法是真正过滤的。
    3.在web.xml文件中配置

下面是实现Filter接口的类

public class TestFilter1 implements Filter{

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        //请求过滤
        System.out.println("我是filter");

        chain.doFilter(request, response);

        //响应过滤
        System.out.println("响应过滤 ");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

接下来我们需要重写接口中方法。

第三步呢就是我们需要在web.xml中配置过滤器的路径。

  <filter>
    <filter-name>TestFilter1</filter-name>
    <filter-class>com.daliyuan.filter.TestFilter1</filter-class>
  </filter>

<filter-mapping>
        <filter-name>TestFilter1</filter-name>
        <url-pattern>/*</url-pattern>
  </filter-mapping>
url-pattern中的内容也就是我们需要写的过滤地址。/*指的是过滤所有页面。

还有就是我们可以写确定的访问地址,比如servlet/Servlet1,这样的话我们指明确的过滤访问Servlet1的数据.

还有就是过滤路径格式是*.name,那么我们就可以过滤所有含有.name结尾的地址了。 格式跟servlet的url地址格式是一样的。

还有一种格式
 <servlet-name>Servlet1</servlet-name>

它是对指定的servlet名称的servlet进行拦截的。


对于实现的接口的方法,我们下面再来具体看一下。

首先要注意到的就是doFilter方法中的chain参数。 chain的方法doFilter(request, response),它实现的功能就是继续执行下面的过滤器。

FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。
问题:怎样可以形成一个Filter链?
    只要多个Filter对同一个资源进行拦截就可以形成Filter链
问题:怎样确定Filter的执行顺序?
    由<filter-mapping>来确定,也就是xml配置文件的顺序。

我们来看一下下面的代码。

System.out.println("我是过滤器2.....请求");

chain.doFilter(request, response);//去执行下一个过滤器

System.out.println("我是过滤器2.....响应");
----------------------------------------------------
System.out.println("我是过滤器3。。。。。 请求");

chain.doFilter(request, response);//去执行index.jsp

System.out.println("我是过滤器3。。。。。 响应");

例如,这里的两个过滤器形成了Filter链,那么就先执行过滤器2然后过滤器3的请求代码。

等请求的页面响应时,是先返回到响应3然后到达响应2




还有一点,我们可能注意到了过滤器中的init方法和destroy方法。

public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("=========初始化.....");
    }

public void destroy() {
        System.out.println("=========销毁了.....");
    }

过滤器在服务器启动加载的时候就创建了,在服务器关闭的时候销毁。

Servlet生命周期:
实例化 --》 初始化 --》 服务 --》 销毁

当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.




我们继续Filter。
下面我们要看的这个是FilterConfig。这个重要性应该一般。

在Filter的init方法上有一个参数,类型就是FilterConfig.
FilterConfig它是Filter的配置对象,它可以完成下列功能
1.获取Filter名称
2.获取Filter初始化参数
3.获取ServletContext对象。

我们获取到的数据是从配置文件获取的

 <filter>
        <filter-name>TestFilter5</filter-name>
        <filter-class>com.qianfeng.filter.TestFilter5</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
  </filter>

然后呢,FilterConfig是这么用的。

private FilterConfig filterConfig;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        String encode = filterConfig.getInitParameter("encoding");
        //request.setCharacterEncoding(encode);
        System.out.println(encode);
        chain.doFilter(request, response);
    }



GO ON 过滤器。

<dispatcher>
可以取的值有  REQUEST  FORWARD  ERROR  INCLUDE    
它的作用是:当以什么方式去访问web资源时,进行拦截操作.   
1.REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值
2.FORWARD 它描述的是请求转发的拦截方式配置
3.ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
    4.INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用
<filter-mapping>
        <filter-name>TestFilter6</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

这个是什么用呢。
之前我们每说过,比如当我们访问一个Servlet1时,Servlet1中有跳转,这时候我们之前的过滤器就不能发挥作用了。

那么就需要修改过滤器的配置了。

这是我们就需要设置dispatcher属性了。
上面也具体说明了,有四种取值。

这是我们再用resquest和response跳转的时候,我们的过滤器就可以拦截了。

Fliter过滤器就说这么多了。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值