Java过滤器实战教程
- 后端开发
- 2025-07-07
- 5
在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注解控制)
-
性能优化:
// 在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环境验证。
- 顺序规则: