Java中拦截器和过滤器的比较


在Java中,拦截器和过滤器是两种常见的用于处理请求和响应的技术,尤其在Web应用中。尽管它们的功能有些重叠,但它们的用途和实现方式有所不同。

过滤器(Filter)

  1. 过滤器是Java Servlet规范的一部分,依赖于Servlet容器(如Tomcat)。
  2. 过滤器在请求到达Servlet之前以及响应离开Servlet之后执行某些操作。
  3. 过滤器通常用于执行如日志记录、字符集设置、CORS策略、身份验证和授权等任务。
  4. 过滤器的实现基于回调函数。
  5. 过滤器的生命周期由Servlet容器管理。

拦截器(Interceptor)

  1. 拦截器通常与特定的框架相关,如Spring MVC。
  2. 拦截器允许在Spring MVC框架处理HTTP请求的过程中,拦截请求并执行特定的逻辑。
  3. 拦截器与Spring MVC的控制器紧密集成,因此可以访问更多的框架特定的功能。
  4. 拦截器的实现基于Java的反射机制(动态代理)。
  5. 拦截器由Spring容器管理,并可以通过IoC容器来获取其他Bean的实例。

主要区别

  1. 实现原理:过滤器基于函数回调,而拦截器基于Java的反射机制(动态代理)。
  2. 使用范围:过滤器是Servlet规范的一部分,依赖于Servlet容器,因此只能在Web程序中使用。而拦截器是Spring组件,由Spring容器管理,可以在任何使用Spring框架的地方使用。
  3. 触发时机:过滤器在请求进入容器后,但在进入Servlet之前进行预处理。拦截器可以在请求被处理之前、之后或完成整个处理流程后执行。
  4. 请求范围:过滤器可以对几乎所有的请求起作用,而拦截器通常只针对特定的控制器请求起作用。
  5. 生命周期管理:过滤器的生命周期由Servlet容器管理,而拦截器由Spring容器管理。

过滤器是Java Servlet规范的一部分,用于在请求到达Servlet之前或响应离开Servlet之后执行某些操作。常见的用途包括日志记录、字符集设置、CORS策略、身份验证和授权等。

@WebFilter("/api/*")  
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("Filtering request...");  
          
        // 继续请求处理  
        chain.doFilter(request, response);  
          
        // 在响应返回客户端之后执行的代码(但通常我们在这里不做什么,因为响应已经发送给客户端了)  
    }  
  
    @Override  
    public void destroy() {  
        // 清理代码(如果有的话)  
    }  
}

注意:上面的示例使用了@WebFilter注解,这是Java EE的注解,用于声明一个过滤器。在Spring Boot中,你可能会使用不同的方式来注册过滤器。
2.
拦截器(Interceptor)

拦截器通常与特定的框架相关,如Spring MVC。它们允许你在Spring MVC框架处理HTTP请求的过程中,拦截请求并执行特定的逻辑。与过滤器不同,拦截器与Spring MVC的控制器紧密集成,因此它们可以访问更多的框架特定的功能。

@Configuration  
public class WebConfig implements WebMvcConfigurer {  
  
    @Override  
    public void addInterceptors(InterceptorRegistry registry) {  
        registry.addInterceptor(new MyInterceptor());  
    }  
      
    public static class MyInterceptor implements HandlerInterceptor {  
          
        @Override  
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {  
            // 在请求被处理之前执行的代码  
            System.out.println("Intercepting request...");  
            return true; // 返回true以继续处理,返回false则中断请求  
        }  
          
        @Override  
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {  
            // 在请求被处理之后,但在视图渲染之前执行的代码  
        }  
          
        @Override  
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {  
            // 在整个请求处理完成后执行的代码(包括视图渲染)  
        }  
    }  
}

在这个示例中,我们创建了一个实现HandlerInterceptor接口的拦截器,并通过实现WebMvcConfigurer接口的addInterceptors方法将其注册到Spring MVC配置中。

相关文章

面试突击90:过滤器和拦截器有什么区别?

过滤器(Filter)和拦截器(Interceptor)都是基于 AOP(Aspect Oriented Programming,面向切面编程)思想实现的,用来解决项目中某一类问题的两种“工具”,但二...

Springboot过滤器和拦截器详解及使用场景

一、过滤器和拦截器的区别1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。2、拦截器可...

聊聊Redis布隆过滤器(原理+实践篇)

1 Bloom Filter 介绍布隆过滤器(Bloom Filter)是 Redis 4.0 版本提供的新功能,我们一般将它当做插件加载到 Redis 服务器中,给 Redis 提供强大的去重功能。...

一种基于布隆过滤器的大表计算优化方法

问题背景在大数据行业内,尤其是数仓建设中,一直有一个绕不开的难题,就是大表的分析计算(这里的大表指亿级以上)。特别是大表之间的 Join 分析,对任何公司数据部门都是一个挑战!主要有以下挑战:由于数据...

Java Web—Filter(过滤器)

web中的过滤器的作用:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。web中过滤器的应用场景:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...Filter...

JAVA:如何实现 Bloom 过滤器?它是做什么用的?

在处理大型数据集时,经常需要快速确定一个元素是否属于某个集合。虽然传统的数据结构如哈希表和树可以完成这项任务,但随着数据量的增加,它们对空间的需求也随之激增。Bloom过滤器提供了一种高度空间效率的概...