Skip to content

拦截器(Interceptor)与过滤器(Filter)的区别及使用方法(Java)

主要区别

特性过滤器(Filter)拦截器(Interceptor)
作用范围Servlet规范的一部分,任何Java Web应用可用通常是框架提供(如Spring MVC)
实现原理基于函数回调基于Java反射和动态代理
依赖依赖Servlet容器(Tomcat等)依赖框架(如Spring)
执行时机在Servlet之前和之后执行在Controller方法前后执行
获取上下文信息只能获取Servlet API的请求/响应对象可以获取Spring上下文和Controller信息
异常处理不能处理Controller抛出的异常可以处理Controller抛出的异常

过滤器(Filter)使用方法

1. 实现Filter接口

java
import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化代码
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 前置处理
        System.out.println("Before filter processing");
        
        // 执行后续过滤器或Servlet
        chain.doFilter(request, response);
        
        // 后置处理
        System.out.println("After filter processing");
    }
    
    @Override
    public void destroy() {
        // 销毁代码
    }
}

2. 配置过滤器(web.xml或注解)

XML配置方式(web.xml):

xml
<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注解方式(Java EE 6+):

java
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
    // ...
}

拦截器(Interceptor)使用方法(以Spring为例)

1. 实现HandlerInterceptor接口

java
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
            throws Exception {
        // Controller方法执行前调用
        System.out.println("Pre-handle interceptor");
        return true; // 返回true继续执行,false中断请求
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // Controller方法执行后,视图渲染前调用
        System.out.println("Post-handle interceptor");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 整个请求完成后调用
        System.out.println("After completion interceptor");
    }
}

2. 注册拦截器(Spring配置)

java
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**") // 拦截所有路径
                .excludePathPatterns("/login"); // 排除登录路径
    }
}

使用场景建议

  • 使用过滤器(Filter)的场景:

    • 请求和响应的内容修改(如编码设置)
    • 跨域处理
    • 静态资源处理
    • 通用日志记录
    • 权限验证(简单场景)
  • 使用拦截器(Interceptor)的场景:

    • 需要访问Spring上下文或Controller信息
    • 需要处理Controller抛出的异常
    • 需要细粒度的权限控制
    • 需要记录Controller方法的执行时间
    • 需要修改ModelAndView对象

执行顺序

在Spring应用中,完整的请求处理流程通常为:

  1. Filter.doFilter() 前置处理
  2. Interceptor.preHandle()
  3. Controller方法执行
  4. Interceptor.postHandle()
  5. 视图渲染
  6. Interceptor.afterCompletion()
  7. Filter.doFilter() 后置处理

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer