拦截器与过滤器

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

1. 过滤器(Filter)

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

特点:

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

主要用途:

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

实现:

  • 实现javax.servlet.Filter接口
  • 重写doFilter方法

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

 

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
实现方式实现javax.servlet.Filter接口实现HandlerInterceptor接口
典型应用场景编码转换、权限验证、日志记录、响应压缩等权限验证、日志记录、异常处理、性能监控等

总结

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

选择使用场景

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

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


 

 示例代码:

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

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

注意事项

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值