Java Web应用中的请求过滤机制详解
过滤器核心概念解析
作为Java EE规范的重要组成部分,过滤器(Filter)与Servlet、监听器共同构成Web应用的三大基础组件。其核心功能在于对客户端请求进行预处理,并对服务器响应实施后置操作。
典型应用场景包括:
- 用户身份验证与权限控制
- 请求日志记录与审计
- 数据加密解密处理
- 跨域请求管理
实战:资源访问控制实现
假设需要保护/secure目录下的所有资源,要求用户必须通过身份验证才能访问。基于Session的验证逻辑如下:
public class SecurityFilter implements javax.servlet.Filter {
@Override
public void doVerify(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 检查会话中的认证标识
if (request.getSession().getAttribute("authToken") == null) {
response.sendRedirect(request.getContextPath() + "/auth/login.html");
return;
}
// 通过验证则继续执行后续流程
chain.doFilter(req, res);
}
@Override
public void initConfig(FilterConfig config) {
// 初始化参数处理
String env = config.getInitParameter("environment");
System.out.println("运行环境: " + env);
}
@Override
public void cleanUp() {
// 资源释放操作
}
}
在部署描述符中的配置:
<filter>
<filter-name>SecurityGuard</filter-name>
<filter-class>com.example.SecurityFilter</filter-class>
<init-param>
<param-name>environment</param-name>
<param-value>production</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SecurityGuard</filter-name>
<url-pattern>/secure/*</url-pattern>
</filter-mapping>
生命周期管理
过滤器执行流程遵循严格生命周期:
- 实例化:容器启动时创建Filter对象
- 初始化:调用
initConfig()方法加载配置参数 - 请求处理:每次请求匹配时触发
doVerify() - 销毁:应用卸载时执行
cleanUp()释放资源
过滤器链工作机制
当多个过滤器同时作用于同一资源路径时,形成过滤器链。其执行特性表现为:
- 执行顺序由
web.xml中声明顺序决定 - 所有过滤器共享同一个请求响应对象
- 通过
chain.doFilter()显式传递处理权
路径匹配规则
过滤器支持三类路径匹配模式:
| 匹配类型 | 配置示例 | 生效路径 |
|---|---|---|
| 精确匹配 | /api/v1/users |
仅匹配指定API端点 |
| 目录匹配 | /admin/* |
匹配目录下所有资源 |
| 扩展名匹配 | *.json |
匹配所有JSON格式响应 |
注意:扩展名匹配不可包含路径分隔符,正确写法为*.json而非/ *.json。过滤器仅验证请求路径格式,不验证资源实际存在性。