FilterChain简介说明

欢喜 Servlet 发布时间:2025-06-04 15:34:19 阅读数:18319 1
下文笔者讲述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()`,
否则无法绕过后续处理
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/Servlet/202506/328.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者