专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 一文读懂Filter使用方法

一文读懂Filter使用方法

更新时间:2021-11-15 10:43:43 来源:星辉 浏览621次

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过滤器就说这么多了。

通过上述相信大家对Filter使用方法已经有所了解,大家如果想了解更多相关知识,可以关注一下星辉的Filter教程,里面的内容通俗易懂,由浅到深,适合小白学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>