Java安全基础(三)Filter核心技术
字数 2676 2025-08-12 11:34:35
Java Web Filter核心技术详解
一、Filter概述
Filter是Servlet API提供的一个接口,开发web应用时,任何实现了javax.servlet.Filter接口的Java类都称为过滤器(Filter)。
1.1 Filter的核心特性
- 是Servlet 2.3规范新增的特性
- Servlet技术中最实用的技术之一
- 能够对所有web资源进行管理
- 主要功能包括:权限访问控制、敏感词汇过滤、响应信息压缩等
1.2 Filter的本质
Filter本质上是对web资源进行拦截的组件,它可以:
- 拦截客户端请求(request)进行处理
- 拦截服务器响应(response)进行处理
- 处理后将请求/响应传递给下一个Filter或Servlet
1.3 常见应用场景
- 编码格式设置
- 访问权限控制
- 敏感字符过滤
- 安全验证
- 日志记录
- 数据压缩
二、Filter配置方式
2.1 基于web.xml配置
基本配置结构:
<web-app>
<filter>
<filter-name>Filter</filter-name>
<filter-class>myPackage.FilterClass</filter-class>
</filter>
<filter-mapping>...</filter-mapping>
</web-app>
2.1.1 <filter>元素详解
icon:可选,IDE使用的图像文件filter-name:必需,过滤器名称display-name:可选,IDE使用的短名称description:可选,IDE显示的信息filter-class:必需,过滤器实现类的完全限定名init-param:可选,初始化参数,可通过FilterConfig获取
2.1.2 <filter-mapping>元素详解
filter-name:必须与<filter>中声明的名称匹配url-pattern:以斜杠(/)开头,指定拦截的URL模式servlet-name:指定过滤器拦截的Servlet名称
2.2 基于注解配置
使用@WebFilter注解可以替代web.xml配置:
@WebFilter(
filterName = "myFilter",
urlPatterns = "/*",
initParams = {
@WebInitParam(name = "param1", value = "value1"),
@WebInitParam(name = "param2", value = "value2")
}
)
public class MyFilter implements Filter {
// 实现方法
}
三、多个Filter的执行顺序
3.1 执行顺序规则
- web.xml配置:按照
<filter-mapping>声明的顺序执行,先声明先执行 - 注解配置:按照Filter类名的字母顺序执行(如A_Filter先于B_Filter)
- 混合配置:web.xml中配置的Filter优先于注解配置的Filter执行
3.2 最佳实践
- 建议Filter之间保持独立,避免依赖执行顺序
- 如需确保顺序,应统一使用web.xml配置并按需排序
四、FilterConfig详解
FilterConfig用于获取Filter的初始化参数,主要方法:
| 方法 | 描述 |
|---|---|
String getFilterName() |
获取Filter名称 |
String getInitParameter(String name) |
获取指定名称的初始化参数值,不存在返回null |
Enumeration getInitParameterNames() |
获取所有初始化参数名的枚举集合 |
ServletContext getServletContext() |
获取ServletContext对象引用 |
使用示例:
public void init(FilterConfig config) {
String filterName = config.getFilterName();
String paramValue = config.getInitParameter("paramName");
// 其他处理
}
五、Filter的访问流程
- 客户端发送请求到服务器
- 请求进入第一个Filter(Filter1)进行处理
- 依次经过Filter链(Filter2, Filter3, ..., FilterN)
- 最终到达目标Servlet的service()方法
- 响应按相反顺序经过Filter链(FilterN, ..., Filter1)
- 服务器将最终响应返回给客户端
六、Filter接口方法
6.1 init(FilterConfig config)
- 用于初始化过滤器
- 容器在实例化Filter后立即调用
- 可以访问FilterConfig获取初始化参数
- 替代构造函数的初始化逻辑
6.2 doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- 核心处理方法
- 参数说明:
request:请求对象response:响应对象chain:Filter链对象
- 必须调用
chain.doFilter()将请求传递给下一个Filter或Servlet - 可以在调用前后添加预处理和后处理逻辑
6.3 destroy()
- 在Filter被卸载前调用
- 用于释放资源(如关闭数据库连接、IO流等)
- 执行清理操作
七、Filter生命周期
- 加载和实例化:容器启动时根据配置顺序实例化Filter
- 初始化:调用
init()方法 - 服务:处理请求时调用
doFilter()方法(可能多次) - 销毁:应用卸载时调用
destroy()方法
八、Filter与Servlet对比
| 特性 | Filter | Servlet |
|---|---|---|
| 配置方式 | web.xml或@WebFilter | web.xml或@WebServlet |
| 处理对象 | 可处理request和response | 主要处理request |
| 主要用途 | 请求拦截和过滤 | 业务逻辑处理 |
| 执行顺序 | 可配置多个形成链式 | 通常独立处理 |
| MVC应用 | 可用于实现控制器(如Struts2) | 可用于实现控制器(如Spring MVC) |
九、安全审计要点
-
Filter审计:
- 检查全局安全过滤是否完整
- 验证敏感URL是否有权限控制
- 尝试绕过Filter的过滤规则
-
Servlet审计:
- 分析业务逻辑安全问题
- 检查访问权限控制
- 确认是否被前置Filter过滤
-
综合考量:
- 不要忽略Filter对Servlet的保护
- 注意Filter和Servlet的协作关系
- 检查MVC框架的实现基础(Filter或Servlet)
十、最佳实践
-
设计原则:
- 单一职责:每个Filter只处理一个特定功能
- 无状态:避免在Filter中保存状态
-
性能优化:
- 在Filter中尽早过滤无效请求
- 避免复杂的业务逻辑
-
安全建议:
- 对关键操作实施多层Filter保护
- 统一处理XSS、SQL注入等安全问题
-
调试技巧:
- 使用日志记录Filter执行顺序
- 验证Filter链是否完整
通过合理使用Filter,可以有效地实现Web应用的横切关注点,提高代码的可维护性和安全性。