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()`, 否则无法绕过后续处理 |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。