@WebFilter注解简介
`@WebFilter`是Java Servlet 3.0
引入一个标准注解(Annotation)
用于声明一个类为过滤器(Filter)
它替代传统 `web.xml` 中
`<filter>` 和 `<filter-mapping>`
配置方式
使开发者可以更简洁地定义和注册过滤逻辑。
`@WebFilter`注解功能
功能 | 描述 |
声明一个 Filter 类 | 标记某个类实现`Filter`接口并作为请求过滤器 |
指定过滤URL模式 | 替代 `<url-pattern>`
控制哪些请求会被该Filter 处理 |
指定过滤Servlet名称 | 替代`<servlet-name>`可选 |
设置初始化参数 | 用`@WebInitParam`配置Filter启动参数 |
支持异步请求处理 | 控制是否支持异步请求过滤 |
`@WebFilter`注解定义
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.Runtime)
public @interface WebFilter {
String[] value() default {};
String[] urlPatterns() default {};
String description() default "";
String filterName() default "";
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
}
例 1:最简使用方式(仅配置 URL 过滤)
@WebFilter("/*")
public class LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑(可选)
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
System.out.println("请求开始: " + httpRequest.getRequestURI());
// 继续执行后续过滤器或目标 Servlet
chain.doFilter(request, response);
System.out.println("请求结束: " + httpRequest.getRequestURI());
}
@Override
public void destroy() {
// 销毁逻辑(可选)
}
}
//以上Filter
将拦截所有请求
并在控制台打印请求路径
例 2
带多个 URL 映射和初始化参数
@WebFilter(
urlPatterns = {"/admin/*", "/api/*"},
initParams = {
@WebInitParam(name = "encoding", value = "UTF-8"),
@WebInitParam(name = "debug", value = "true")
},
filterName = "CharacterEncodingFilter"
)
public class CharacterEncodingFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
String debug = filterConfig.getInitParameter("debug");
System.out.println("字符编码设置为:" + encoding);
if ("true".equals(debug)) {
System.out.println("调试模式已开启");
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
@Override
public void destroy() {
//清理资源
}
}
`@WebFilter`注解与 `web.xml` 对比
使用 `web.xml` 的传统写法:
```xml
<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoggingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
使用`@WebFilter`后
可完全省去XML配置
使代码更简洁、模块化更强
`@WebFilter`注解 支持的匹配方式(urlPatterns)
匹配方式 | 示例 | 说明 |
精确匹配 | `/login` | 只匹配 `/login` 请求 |
路径匹配 | `/admin/*` | 匹配 `/admin/user`, `/admin/settings` 等 |
扩展名匹配 | `*.jsp` | 匹配所有 `.jsp` 文件请求 |
默认匹配 | `/*` | 匹配所有请求 |
`@WebFilter`注解适用场景
场景 | 使用方式 |
设置字符编码 | 如 UTF-8 编码统一处理 |
日志记录 | 记录请求开始和结束时间 |
权限验证 | 拦截未登录用户访问后台接口 |
敏感词过滤 | 修改请求内容或响应内容 |
响应头设置 | 添加 CORS、Cache-Control 等响应头 |
性能监控 | 统计请求耗时、吞吐量等指标 |