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 请求 |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。