过滤器的执行顺序
Servlet 过滤器(Filter)的执行顺序
在 Java Web 开发中,多个过滤器(Filter) 可以按照一定的顺序执行,通常由 @WebFilter
注解的 order
或 web.xml
配置的 filter-mapping
来控制。
1. 过滤器执行的基本流程
当客户端请求到达服务器时:
-
所有匹配的过滤器 会按照优先级依次执行
doFilter()
方法。 -
过滤器可以修改请求或响应(如权限验证、日志记录等)。
-
调用
chain.doFilter(request, response);
后,请求会继续传递给下一个过滤器或最终的 Servlet 处理。 -
当 Servlet 处理完毕后,响应会依次回溯经过过滤器链(执行
doFilter()
方法中的response
处理部分)。
2. 过滤器的默认执行顺序
如果没有特殊指定,过滤器的执行顺序如下:
-
按照
@WebFilter
或web.xml
配置的顺序执行(从上到下)。 -
先执行
doFilter(request, response)
之前的代码。 -
请求传递到目标 Servlet 或下一个过滤器。
-
Servlet 处理完成后,返回响应时,按照 "栈" 的方式依次执行
doFilter()
之后的代码(即 后进先出)。
示例
假设有 FilterA
、FilterB
和 FilterC
,它们的顺序为:
-
FilterA
-
FilterB
-
FilterC
-
Servlet
处理请求 -
响应回溯(
FilterC -> FilterB -> FilterA
)
FilterA → FilterB → FilterC → Servlet 处理 → FilterC 回溯 → FilterB 回溯 → FilterA 回溯
3. 如何控制多个过滤器的执行顺序?
(1)@WebFilter
+ @Order
控制
在 Spring Boot 或 Servlet 3.0+ 的环境下,可以使用 @Order
注解 来控制执行顺序:
@Order(1) // 数字越小,优先级越高,最先执行
@WebFilter("/admin/*")
public class AuthFilter implements Filter {
// 过滤器代码
}
@Order(2)
@WebFilter("/*")
public class LogFilter implements Filter {
// 记录日志
}
(2)web.xml
配置顺序
在 web.xml
里,filter-mapping
出现的顺序决定了执行顺序:
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.example.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.example.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在这个例子中:
-
AuthFilter
先执行(因为它的filter-mapping
先出现)。 -
LogFilter
后执行。