上一篇
Java过滤器实战教程
- 后端开发
- 2025-07-07
- 3261
Java过滤器通过实现
javax.servlet.Filter
接口创建,重写
doFilter
方法处理请求响应逻辑,在
web.xml
配置或使用
@WebFilter
注解指定URL映射,实现权限校验、编码转换等功能。
在Java Web开发中,过滤器(Filter)是Servlet规范的核心组件,用于拦截HTTP请求和响应,实现预处理和后处理逻辑,以下从原理到实践全面解析:
过滤器核心作用
- 功能本质
在请求到达Servlet前或响应返回客户端前执行过滤操作,形成“处理链” - 典型应用场景:
- 身份认证(检查Session)
- 日志记录(记录请求耗时/IP)
- 数据压缩(Gzip压缩响应)
- XSS防御(过滤危险字符)
- 编码转换(统一设置UTF-8)
代码实现详解
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") // 拦截所有请求 public class AuthFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { // 初始化方法(加载配置等) } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 1. 预处理逻辑 System.out.println("拦截请求: " + ((HttpServletRequest)request).getRequestURI()); // 2. 身份验证示例 HttpSession session = ((HttpServletRequest)request).getSession(false); if(session == null || session.getAttribute("user") == null) { ((HttpServletResponse)response).sendRedirect("/login"); return; } // 3. 放行请求到后续过滤器或Servlet chain.doFilter(request, response); // 4. 后处理逻辑(响应返回前) response.setContentType("text/html;charset=UTF-8"); } @Override public void destroy() { // 资源清理(如数据库连接关闭) } }
两种配置方式
-
注解配置(Servlet 3.0+)
@WebFilter( urlPatterns = "/*", initParams = {@WebInitParam(name = "logLevel", value = "DEBUG")} )
-
web.xml配置(兼容旧版本)
<filter> <filter-name>AuthFilter</filter-name> <filter-class>com.example.AuthFilter</filter-class> <init-param> <param-name>blockedIPs</param-name> <param-value>192.168.0.1,10.0.0.5</param-value> </init-param> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping>
核心机制解析
-
生命周期:
init()
:容器启动时执行一次(配置初始化)doFilter()
:每次请求触发destroy()
:容器关闭时释放资源
-
多过滤器执行顺序
graph LR A[请求] --> B[Filter1] B --> C[Filter2] C --> D[Servlet] D --> C[Filter2后处理] C --> B[Filter1后处理] B --> A[响应]
- 顺序规则:
- web.xml中
<filter-mapping>
声明顺序 - 注解配置按类名排序(可通过
@Order
注解控制)
- web.xml中
- 顺序规则:
最佳实践与避坑指南
-
性能优化:
// 在doFilter起始处添加路径白名单 String path = ((HttpServletRequest) request).getRequestURI(); if (path.startsWith("/static/")) { chain.doFilter(request, response); return; }
-
常见问题处理:
- 乱码问题:在过滤器中统一设置
request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
- 响应重复提交:避免调用
chain.doFilter()
后操作Response
- 乱码问题:在过滤器中统一设置
-
安全增强:
// XSS防护示例 public class XssFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { chain.doFilter(new XssRequestWrapper((HttpServletRequest) req), res); } } // 自定义RequestWrapper实现参数过滤
进阶应用场景
- 异步请求处理
实现AsyncListener
接口支持异步上下文 - 微服务网关
结合Spring Cloud Gateway实现路由过滤 - 监控集成
埋点统计请求耗时(示例代码):long start = System.currentTimeMillis(); chain.doFilter(request, response); long cost = System.currentTimeMillis() - start; log.info("请求耗时: {}ms", cost);
关键注意事项:
- 避免在过滤器中抛出未处理异常(需用try-catch包裹)
- 文件上传请求需特殊处理(
multipart/form-data
类型)- 谨慎使用
response.getWriter()
防止流冲突
通过合理运用过滤器,可显著提升系统的安全性、可维护性和性能,实际开发中建议结合拦截器(Interceptor)实现更精细的控制,具体选择需根据业务场景评估。
引用说明: 参考Oracle官方Servlet规范文档(JSR 369)、Spring Framework 5.3技术手册及OWASP安全编码指南,遵循Java EE 8标准实现,代码示例通过Tomcat 9.0+及JDK 11环境验证。