拦截器与过滤器

时间:2025-01-21 06:58:18

拦截器(Interceptor)和过滤器(Filter)都能够对请求进行拦截和处理。虽然它们的功能相似,但实现机制和使用场景却有所不同。

1. 过滤器(Filter)

过滤器是基于Servlet API的组件,用于对请求和响应进行预处理和后处理。它主要用于处理HTTP请求,能够对请求进行过滤、修改或增强。

特点:

  • 依赖于Servlet容器:过滤器是Servlet规范的一部分,必须在Servlet容器中运行。
  • 处理请求和响应:过滤器可以在请求到达Servlet之前和响应返回给客户端之前进行处理。
  • 配置方式:通过文件或注解进行配置,指定过滤器的URL模式。
  • 执行顺序:多个过滤器按照在中配置的顺序依次执行。

主要用途:

  • 设置字符编码。
  • 记录日志。
  • 进行权限控制。
  • 过滤敏感词汇。
  • 处理跨域请求等。

实现:

  • 实现接口
  • 重写doFilter方法

详细的过滤器讲解可以看这里:JavaWeb-Filter(过滤器)-****博客

 

2. 拦截器(Interceptor)

拦截器通常用于面向切面编程(AOP),它允许开发者在方法调用之前或之后执行特定的操作。拦截器主要用于控制器(Controller)层的逻辑处理。

 

 

特点:

  • 不依赖于Servlet容器:拦截器可以在Spring等框架中实现,通常不依赖于Servlet API。
  • 针对方法调用:拦截器主要用于拦截方法调用,可以在控制器方法执行前后进行处理。
  • 配置方式:通过框架的配置文件(如Spring的XML配置或Java配置)进行配置。
  • 执行顺序:多个拦截器可以按照配置的顺序执行,通常在控制器方法执行前执行。

主要用途:

  • 登录验证。
  • 权限检查。
  • 日志记录。
  • 性能监控。
  • 处理请求参数等。

实现:

  • 实现HandlerInterceptor接口
  • 重写preHandle、postHandle、afterCompletion方法

 
 

拦截器与过滤器的对比

特征 过滤器 拦截器
定义 基于函数回调,部署在Servlet容器中。 基于动态代理,在Spring MVC框架中使用。
作用范围 所有进入容器的请求 Controller方法
执行时机 较早,在Servlet容器接收到请求时执行。 较晚,在Spring MVC处理请求时执行。
拦截能力 可以拦截所有请求,包括静态资源。 主要拦截Controller方法。
访问范围 只能访问ServletRequest和ServletResponse对象。 可以访问Action上下文、值栈中的对象,还可以获取IOC容器中的各个bean。
AOP 不是基于AOP 基于Spring AOP
实现方式 实现接口 实现HandlerInterceptor接口
典型应用场景 编码转换、权限验证、日志记录、响应压缩等 权限验证、日志记录、异常处理、性能监控等

总结

  • 过滤器更适合全局性的操作,如编码转换、权限验证等,可以对所有请求进行处理。
  • 拦截器更适合业务逻辑相关的拦截,如日志记录、异常处理等,可以访问更多的上下文信息,并且可以利用Spring框架的特性。

选择使用场景

  • 需要拦截所有请求时:选择过滤器。
  • 需要访问Action上下文、值栈中的对象时:选择拦截器。
  • 需要利用Spring框架的特性时:选择拦截器。
  • 需要在Controller方法执行前后进行处理时:选择拦截器。

但是,实际使用了Spring框架开发中,使用拦截器的频率远大于使用过滤器,过滤器能干的活拦截器基本都能干


 

 示例代码:

// 过滤器
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 预处理
        (request, response);
        // 后处理
    }
}

// 拦截器
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 预处理
        return true;
    }
}

注意事项

  • 过滤器和拦截器都可以用于日志记录,但拦截器可以访问更多的上下文信息,因此在记录日志时可以提供更详细的信息。
  • 过滤器和拦截器都可以用于权限验证,但拦截器可以更好地与Spring Security等安全框架集成。
  • 过滤器和拦截器执行顺序:一般情况下,过滤器先执行,然后是拦截器。