FilterChain简介说明
下文笔者讲述FilterChain简介说明,如下所示
FilterChain简介
`FilterChain`(过滤器链)
是Java Servlet规范中一个核心接口
定义在`javax.servlet.FilterChain`包中
它用于管理多个Filter执行顺序
并控制请求流转过程
FilterChain作用
1.串联多个Filter
- 当有多个Filter 被配置时
它们会按照声明顺序组成一条链。
- 每个 Filter 执行完自己的逻辑后,调用`chain.doFilter()`
将请求传递给下一个Filter或最终的目标资源(如 Servlet、JSP等)
2.控制请求和响应流程
- 在请求到达目标资源前,
Filter可以对请求进行预处理(如设置编码、权限校验等)
- 在响应返回客户端前,
Filter可以对响应进行后处理(如压缩、日志记录等)
FilterChain运行流程
请求阶段(前置处理)
- 请求从客户端发送到服务器。
- Web 容器按 `web.xml` 中 `<filter-mapping>` 的顺序依次
调用每个 Filter 的 [doFilter()] 方法。
- 每个 Filter 可以:
- 修改请求对象;
- 做一些业务判断(如是否放行);
- 调用 `chain.doFilter()` 继续执行后续 Filter 或目标资源。
到达目标资源(Servlet/JSP)
-所有过滤器处理完毕后,
请求到达目标Servlet或JSP页面
-执行业务逻辑并生成响应
响应阶段(后置处理)
- 响应从目标资源返回,
再次经过所有Filter
但顺序相反。
- 每个Filter可以修改响应内容或添加额外头信息。
FilterChain示例
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 前置处理:请求进入
System.out.println("MyFilter: 请求到达前");
// 继续执行后续 Filter 或目标资源
chain.doFilter(request, response);
// 后置处理:响应返回时
System.out.println("MyFilter: 响应返回后");
}
}
当有两个Filter:
public class AnotherFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("AnotherFilter: 请求到达前");
chain.doFilter(request, response);
System.out.println("AnotherFilter: 响应返回后");
}
}
运行输出信息,如下所示
MyFilter: 请求到达前
AnotherFilter: 请求到达前
[执行目标 Servlet]
AnotherFilter: 响应返回后
MyFilter: 响应返回后
四、FilterChain配置方式
1. web.xml 配置
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>AnotherFilter</filter-name>
<filter-class>com.example.AnotherFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AnotherFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter 执行顺序由 `<filter-mapping>` 的书写顺序决定。
2.注解方式(Servlet 3.0+)
@WebFilter("/*")
public class MyFilter implements Filter {}
FilterChain注意事项
| 注意项 | 说明 |
| Filter 顺序 | 严格依赖`web.xml`中 `<filter-mapping>`声明顺序 |
| 性能影响 | 多个 Filter 会增加请求处理时间, 避免过度使用 |
| 线程安全 | Filter 是单例的,需注意线程安全问题 |
| 异常处理 | 如果 Filter 抛出异常,将中断请求流程, 不会继续执行后续 Filter |
| 不可跳过 Filter | 一旦 Filter 被匹配,除非不调用 `chain.doFilter()`, 否则无法绕过后续处理 |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


