抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了Filter的原理和使用方法。

环境

Windows 10 企业版 LTSC 21H2
Java 1.8
Tomcat 8.5.50

1 简介

Filter在浏览器和目标资源之间起到过滤的作用,可以动态地拦截请求和响应。

Filter是JavaWeb三大组件之一。

2 流程

当服务器收到请求后,先将请求交给过滤器,符合过滤条件的请求会被拦截并执行处理方法,不符合过滤条件的请求会被直接放行,交由目标服务处理。

在处理方法中可以对请求信息进行读取和修改等操作,并根据结果选择是否放行请求,放行成功的请求会交由目标服务处理,放行失败的请求会直接返回响应到客户端。

目标服务处理完成后,将响应返回到客户端之前,会被过滤器拦截响应,过滤器可以对响应信息进行读取和修改等操作,然后将响应放行到客户端。

在一个Web应用中可以部署多个过滤器,多个过滤器组成了过滤器链,请求必须经过多个过滤器后才能到达目标服务,响应必须经过和请求相同的过滤器后才能返回客户端。

3 生命周期

Filter的生命周期和Servlet类似:

  • 创建:过滤器实例创建后马上调用init()方法进行初始化操作。
  • 过滤:使用doFilter()方法对请求和响应进行处理。
  • 销毁:服务器停止时调用destroy()方法来释放资源。

4 注册

实现过滤器接口后,还需要注册过滤器才能生效,注册方式有两种:

  • 通过配置文件注册,在web.xml中配置过滤器:
    web.xml
    1
    2
    3
    4
    5
    6
    7
    8
    <filter>
    <filter-name>testFilter</filter-name>
    <filter-class>com.example.filter.TestFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>testFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 通过注解注册,使用@WebFilter注解:
    TestFilter.java
    1
    2
    3
    4
    @WebFilter("/*")
    public class TestFilter implements Filter {
    ...
    }

5 使用

实现接口:

TestFilter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@WebFilter("/*")
public class TestFilter implements Filter {

@Override
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("init ...");
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("before doFilter ...");
chain.doFilter(request, response);
System.out.println("after doFilter ...");
}

@Override
public void destroy() {
System.out.println("destroy ...");
}
}

评论