当前位置:首页 > 后端开发 > 正文

Java过滤器实战教程

Java过滤器通过实现 javax.servlet.Filter接口创建,重写 doFilter方法处理请求响应逻辑,在 web.xml配置或使用 @WebFilter注解指定URL映射,实现权限校验、编码转换等功能。

在Java Web开发中,过滤器(Filter)是Servlet规范的核心组件,用于拦截HTTP请求和响应,实现预处理和后处理逻辑,以下从原理到实践全面解析:

过滤器核心作用

  1. 功能本质

    在请求到达Servlet前或响应返回客户端前执行过滤操作,形成“处理链”

  2. 典型应用场景
    • 身份认证(检查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() { // 资源清理(如数据库连接关闭) } }

两种配置方式

  1. 注解配置(Servlet 3.0+)

    @WebFilter( urlPatterns = "/*", initParams = {@WebInitParam(name = "logLevel", value = "DEBUG")} )
  2. web.xml配置(兼容旧版本)

    Java过滤器实战教程 第1张

    <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>

核心机制解析

  1. 生命周期

    • init():容器启动时执行一次(配置初始化)
    • doFilter():每次请求触发
    • destroy():容器关闭时释放资源
  2. 多过滤器执行顺序

    Java过滤器实战教程 第2张

    graph LR A[请求] --> B[Filter1] B --> C[Filter2] C --> D[Servlet] D --> C[Filter2后处理] C --> B[Filter1后处理] B --> A[响应]
    • 顺序规则:
      • web.xml中<filter-mapping>声明顺序
      • 注解配置按类名排序(可通过@Order注解控制)
      • 最佳实践与避坑指南

        1. 性能优化

          // 在doFilter起始处添加路径白名单 String path = ((HttpServletRequest) request).getRequestURI(); if (path.startsWith("/static/")) { chain.doFilter(request, response); return; }
        2. 常见问题处理

          • 乱码问题:在过滤器中统一设置 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
          • 响应重复提交:避免调用chain.doFilter()后操作Response
        3. 安全增强

          Java过滤器实战教程 第3张

          // 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实现参数过滤

        进阶应用场景

        1. 异步请求处理

          实现AsyncListener接口支持异步上下文

        2. 微服务网关

          结合Spring Cloud Gateway实现路由过滤

        3. 监控集成

          埋点统计请求耗时(示例代码): long start = System.currentTimeMillis(); chain.doFilter(request, response); long cost = System.currentTimeMillis() - start; log.info("请求耗时: {}ms", cost);

        关键注意事项

        1. 避免在过滤器中抛出未处理异常(需用try-catch包裹)
        2. 文件上传请求需特殊处理(multipart/form-data类型)
        3. 谨慎使用response.getWriter()防止流冲突

        通过合理运用过滤器,可显著提升系统的安全性、可维护性和性能,实际开发中建议结合拦截器(Interceptor)实现更精细的控制,具体选择需根据业务场景评估。


        引用说明: 参考Oracle官方Servlet规范文档(JSR 369)、Spring Framework 5.3技术手册及OWASP安全编码指南,遵循Java EE 8标准实现,代码示例通过Tomcat 9.0+及JDK 11环境验证。

0