Servlet之Filter简介说明
下文笔者讲述Servlet之Filter简介说明,如下所示
Filter(过滤器)简介
Filter(过滤器)是 Java Web 应用中的一个核心组件,属于 Servlet 规范的一部分。 它主要用于**在请求到达 Servlet 之前或响应返回客户端之前进行拦截和处理**, 适用于日志记录、权限验证、编码设置、敏感词过滤等通用逻辑。
Filter功能说明
-请求拦截:对所有或特定的请求进行统一处理。 -响应处理:修改响应内容或头信息。 -权限控制:如登录检查、Token 验证。 -日志记录:记录访问时间、IP、请求路径等。 -字符编码:设置统一的请求/响应编码(如UTF-8) -缓存控制:设置HTTP缓存头。
Filter生命周期
Filter 的生命周期由 Web 容器(如 Tomcat)管理,包含以下三个阶段:
| 方法 | 调用时机 | 说明 |
| [init(FilterConfig config)] | Web 应用启动时调用一次 | 初始化配置参数 |
| [doFilter(ServletRequest request, ServletResponse response, FilterChain chain)] | 每次请求都会调用 | 执行过滤逻辑, 调用`chain.doFilter()`继续传递请求 |
| [destroy()] | Web 应用卸载时调用一次 | 释放资源 |
Filter示例
public class EncodingFilter implements Filter {
private String encoding = "UTF-8";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String configEncoding = filterConfig.getInitParameter("encoding");
if (configEncoding != null && !configEncoding.isEmpty()) {
encoding = configEncoding;
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
// 打印访问日志
System.out.println("请求来源 IP:" + request.getRemoteAddr());
chain.doFilter(request, response); // 放行请求
}
@Override
public void destroy() {
// 清理资源
}
}
Filter配置方式
1.web.xml配置(传统方式)
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.example.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 拦截所有请求 -->
</filter-mapping>
2.注解方式(Servlet 3.0+)
@WebFilter("/*")
public class EncodingFilter implements Filter {
// ...
}
FilterChain过滤链说明
多个 Filter 可以组成一个**过滤链**,执行顺序如下:
1.按照`web.xml` 中
`<filter-mapping>`声明顺序依次执行 `doFilter` 前半部分。
2.到达目标Servlet。
3.再按逆序执行每个Filter的`doFilter`后半部分(即响应处理部分)
示意图:
Client → Filter1 → Filter2 → ... → Servlet → Filter2 ← Filter1 ← Client
在Spring中Filter和Interceptor区别
| 特性 | Filter | Interceptor(拦截器) |
| 所属规范 | Servlet 规范 | Spring MVC 自定义 |
| 控制粒度 | 更粗(URL 匹配) | 更细(Controller 方法级别) |
| 是否依赖 Spring | 否 | 是 |
| 是否能获取 Spring Bean | 否 | 是 |
| 处理范围 | 所有请求(包括静态资源) | 仅 Spring MVC 请求 |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


