@WebFilter 注解
@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 {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("请求进入过滤器");
// 继续请求(让请求到下一个过滤器或目标 Servlet)
chain.doFilter(request, response);
System.out.println("响应离开过滤器");
}
@Override
public 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 {
@Override
public 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
指定多个过滤器的执行顺序。