Filter(过滤器)是 Java Web 开发的核心组件之一,用于在请求到达 Servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析:
一、Filter 的作用与原理
-
核心作用
Filter 充当请求与响应之间的“中间层”,主要功能包括:-
请求预处理:如统一编码设置、敏感词过滤、权限校验。
-
响应后处理:如压缩响应内容、添加安全头。
-
资源拦截控制:根据规则限制对特定资源的访问(如登录校验)。
-
-
工作原理
-
过滤器链:多个 Filter 按配置顺序形成链式处理,请求依次通过每个 Filter,响应则反向传递。
-
拦截时机:可配置拦截请求类型(如
REQUEST
、FORWARD
)。
-
二、Filter 的创建与配置
-
实现 Filter 接口
需实现javax.servlet.Filter
接口,并重写三个生命周期方法:public class AuthFilter implements Filter { @Override public void init(FilterConfig config) { /* 初始化资源 */ } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 请求处理逻辑(如权限检查) chain.doFilter(req, res); // 放行 // 响应处理逻辑(如日志记录) } @Override public void destroy() { /* 释放资源 */ } }
-
配置方式
-
XML 配置(
web.xml
):<filter> <filter-name>AuthFilter</filter-name> <filter-class>com.example.AuthFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/secure/*</url-pattern> <dispatcher>REQUEST</dispatcher> <!-- 拦截请求类型 --> </filter-mapping>
-
注解配置(推荐):
@WebFilter(urlPatterns = {"/secure/*"}, initParams = {@WebInitParam(name = "param", value = "value")}) public class AuthFilter implements Filter { /* ... */ }
-
三、Filter 的生命周期
-
init()
方法-
触发时机:服务器启动时执行一次,用于加载初始化参数或资源(如数据库连接)。
-
参数:
FilterConfig
可获取配置信息(如<init-param>
)。
-
-
doFilter()
方法-
核心逻辑:每次请求符合拦截路径时执行,需调用
chain.doFilter()
放行。 -
拦截与修改:可在此修改请求/响应对象(如重写
HttpServletRequestWrapper
)。
-
-
destroy()
方法- 触发时机:服务器关闭时执行,用于释放资源(如关闭线程池)。
四、拦截路径配置详解
-
URL 匹配模式
• 精确匹配:/login
仅拦截该路径请求。• 目录匹配:
/admin/*
拦截/admin
下所有子路径。• 后缀匹配:
*.jsp
拦截所有 JSP 请求。• 全局匹配:
/*
拦截所有请求。 -
拦截类型(Dispatcher)
•REQUEST
:直接请求(默认)。•
FORWARD
:拦截转发请求(如request.getRequestDispatcher().forward()
)。•
ERROR
:拦截错误页面跳转。
五、多 Filter 执行顺序
-
配置顺序规则
• XML 配置:按<filter-mapping>
定义的顺序执行。• 注解配置:默认按类名字典序执行(不同容器可能有差异)。
-
示例流程
请求 → Filter1 → Filter2 → Servlet → Filter2 → Filter1 → 响应
六、典型应用场景
-
统一编码设置
public class EncodingFilter implements Filter { @Override public void doFilter(...) { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } }
-
权限控制
public class LoginFilter implements Filter { @Override public void doFilter(...) { HttpSession session = ((HttpServletRequest) request).getSession(); if (session.getAttribute("user") == null) { ((HttpServletResponse) response).sendRedirect("/login"); } else { chain.doFilter(request, response); } } }
-
日志记录与性能监控
public class LogFilter implements Filter { @Override public void doFilter(...) { long startTime = System.currentTimeMillis(); chain.doFilter(request, response); long duration = System.currentTimeMillis() - startTime; System.out.println("请求耗时:" + duration + "ms"); } }
七、注意事项
-
线程安全
Filter 实例为单例,避免在类中定义成员变量(若需共享数据,使用ThreadLocal
)。 -
性能优化
• 减少doFilter()
中的阻塞操作(如远程调用),必要时结合异步处理。• 合理设置拦截路径,避免全局拦截导致性能下降。
-
异常处理
在doFilter()
中捕获异常,防止因未处理异常导致过滤器链中断。
总结
Filter 是 Java Web 开发中实现全局逻辑控制的核心工具,通过灵活配置拦截路径和类型,可高效完成编码转换、权限校验、日志记录等通用功能。合理设计过滤器链和执行顺序,能显著提升应用的可维护性和安全性。