@WebFilter 是 Java Servlet 3.0 之后引入的注解(Annotation),用于定义Servlet 过滤器(Filter),避免在 web.xml 里进行繁琐的配置。
1. @WebFilter 的作用
 
-  
用于标记一个类是Servlet 过滤器。
 -  
通过
urlPatterns或value指定要拦截的请求路径。 -  
过滤器可以在请求到达 Servlet 之前或返回客户端之前进行处理,如权限校验、日志记录、修改请求/响应等。
 
2. @WebFilter 的基本使用
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*") // 拦截所有请求
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("请求进入过滤器");// 继续请求(让请求到下一个过滤器或目标 Servlet)chain.doFilter(request, response);System.out.println("响应离开过滤器");}@Overridepublic void destroy() {System.out.println("过滤器销毁");}
}
 
 
 
3. @WebFilter 主要参数
 
(1)urlPatterns / value
 
指定要拦截的请求路径。
@WebFilter(urlPatterns = {"/api/*", "/admin/*"})
// 或者
@WebFilter(value = {"/api/*", "/admin/*"}) 
(2)servletNames
 
指定拦截特定的 Servlet,而不是路径。
@WebFilter(servletNames = {"MyServlet"})
 
(3)dispatcherTypes
 
控制过滤器在请求的哪个阶段执行:
-  
REQUEST(默认):普通请求。 -  
FORWARD:RequestDispatcher.forward()转发时触发。 -  
INCLUDE:RequestDispatcher.include()包含时触发。 -  
ERROR:错误请求时触发。 -  
ASYNC:异步请@WebFilter(urlPatterns = "/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})求时触发。
 
4. 过滤器的执行顺序
-  
多个过滤器按照类名的字母顺序执行,例如:
-  
AFilter先执行,BFilter后执行。 
 -  
 -  
如果要手动指定顺序,可以使用
@WebFilter配合@Order注解: 
@Order(1) // 优先级高,先执行
@WebFilter("/*")
public class FirstFilter implements Filter {}@Order(2) // 优先级低,后执行
@WebFilter("/*")
public class SecondFilter implements Filter {}
 
5. @WebFilter vs. web.xml 配置
 
| 方式 | 优势 | 劣势 | 
|---|---|---|
@WebFilter | 代码简洁,易读 | 不能动态修改,需要重启服务器 | 
web.xml | 可动态修改,无需改代码 | 代码较冗长,手写 XML | 
6. 进阶:登录拦截器示例
@WebFilter("/admin/*") // 仅拦截 /admin/ 目录
public class AuthFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;HttpSession session = req.getSession(false);if (session == null || session.getAttribute("user") == null) {res.sendRedirect("/login.jsp"); // 未登录,跳转到登录页面return;}chain.doFilter(request, response); // 继续执行}
}
 
总结
-  
@WebFilter用于定义过滤器,拦截特定 URL 或 Servlet 请求。 -  
doFilter()需要调用chain.doFilter(request, response)放行请求,否则会中断请求链。 -  
过滤器可以拦截请求、修改响应、实现权限控制、日志记录等功能。
 -  
可使用
@Order指定多个过滤器的执行顺序。 
