首页 > 其他分享 >拦截器(Interceptor)与过滤器(Filter)的联系和区别

拦截器(Interceptor)与过滤器(Filter)的联系和区别

时间:2024-12-23 16:56:16浏览次数:5  
标签:控制器 拦截器 请求 Spring Filter 过滤器 Interceptor Servlet

拦截器(Interceptor)与过滤器(Filter)的联系和区别

在 Spring 和 Java Web 开发中,拦截器(Interceptor)和过滤器(Filter)都是用于在请求到达目标资源(如控制器、Servlet)之前或之后执行某些逻辑的机制。它们的主要作用是处理跨切面的逻辑,比如日志记录、权限验证、性能监控等。虽然它们的功能相似,但在实现方式、作用范围和使用场景上存在一些关键的区别。


1. 定义与作用

过滤器(Filter)
  • 定义Filter 是 Servlet 规范的一部分,属于 Java EE(Jakarta EE)的标准组件。它可以在请求到达 Servlet 之前或响应返回给客户端之前对请求和响应进行处理。

  • 作用

    • 预处理:在请求到达 Servlet 之前,可以对请求进行预处理,例如修改请求头、参数、编码等。
    • 后处理:在 Servlet 处理完请求后,可以在响应返回给客户端之前对响应进行处理,例如压缩响应内容、添加响应头等。
    • 权限控制:可以用于实现简单的权限控制,阻止未授权的用户访问某些资源。
    • 日志记录:可以记录请求和响应的详细信息,便于调试和监控。
    • 性能监控:可以记录请求的处理时间,帮助分析系统的性能瓶颈。
  • 生命周期

    • init():初始化过滤器,通常在应用启动时调用。
    • doFilter(ServletRequest request, ServletResponse response, FilterChain chain):处理请求和响应的核心方法,链式调用下一个过滤器或目标资源。
    • destroy():销毁过滤器,通常在应用关闭时调用。
  • 适用范围

    • 过滤器可以应用于整个 Web 应用程序中的所有请求,或者通过配置指定特定的 URL 模式。
    • 它是基于 Servlet 规范的,因此适用于所有基于 Servlet 的框架(如 Spring MVC、Struts 等)。
拦截器(Interceptor)
  • 定义Interceptor 是 Spring MVC 框架提供的一个扩展点,专门用于拦截进入控制器的请求。它是 Spring AOP(面向切面编程)的一种实现,主要用于处理与业务逻辑无关的横切关注点。

  • 作用

    • 预处理:在请求到达控制器之前,可以对请求进行预处理,例如验证用户身份、修改请求参数、记录日志等。
    • 后处理:在控制器处理完请求后,可以在视图渲染之前对模型数据进行处理,或者在视图渲染完成后对响应进行处理。
    • 异常处理:可以在拦截器中捕获控制器抛出的异常,并进行统一处理。
    • 日志记录:可以记录请求和响应的详细信息,便于调试和监控。
    • 性能监控:可以记录请求的处理时间,帮助分析系统的性能瓶颈。
  • 生命周期

    • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在控制器方法执行之前调用,返回 true 表示继续执行,返回 false 表示中断请求。
    • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在控制器方法执行完毕后,但在视图渲染之前调用,可以修改 ModelAndView 对象。
    • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在视图渲染完成后调用,可以用于清理资源或记录日志。
  • 适用范围

    • 拦截器只能应用于 Spring MVC 框架中的请求,即只能拦截进入控制器的请求。
    • 它是 Spring 框架特有的机制,不能直接用于其他非 Spring 的 Servlet 应用。

2. 联系与区别

联系
  • 共同目标:两者都可以在请求到达目标资源之前或之后执行某些逻辑,用于处理跨切面的关注点,如日志记录、权限验证、性能监控等。
  • 链式调用:两者都支持链式调用,即可以配置多个过滤器或拦截器,按顺序依次执行。
  • 灵活性:两者都可以根据需要选择性地应用到特定的 URL 模式或请求路径上。
区别
特性过滤器(Filter)拦截器(Interceptor)
规范/框架Servlet 规范的一部分,适用于所有基于 Servlet 的应用Spring MVC 框架特有的机制,仅适用于 Spring MVC 请求
作用范围可以拦截所有进入 Servlet 容器的请求只能拦截进入 Spring MVC 控制器的请求
生命周期管理由 Servlet 容器管理,独立于 Spring 容器由 Spring 容器管理,依赖于 Spring 的 Bean 生命周期
配置方式通过 web.xml 或注解 @WebFilter 配置通过 Spring 配置类或 XML 配置
处理时机可以在请求到达 Servlet 之前或之后处理可以在请求到达控制器之前、视图渲染之前或之后处理
AOP 支持不直接支持 AOP,但可以通过组合使用基于 Spring AOP 实现,支持更复杂的切面逻辑
依赖注入不能直接注入 Spring Bean(除非通过 ServletContext可以直接注入 Spring Bean,享受 Spring 的依赖注入功能

3. 选择使用场景

  • 使用过滤器的场景

    • 当你需要对所有进入 Servlet 容器的请求进行处理时,例如设置字符编码、处理 CORS 请求、日志记录等。
    • 当你需要处理与 Spring MVC 无关的请求时,例如静态资源请求、第三方库的请求等。
    • 当你需要在请求到达任何控制器之前进行全局性的处理时,例如权限验证、安全检查等。
  • 使用拦截器的场景

    • 当你需要对进入 Spring MVC 控制器的请求进行处理时,例如验证用户身份、记录请求日志、处理异常等。
    • 当你需要在控制器方法执行前后进行操作时,例如修改请求参数、处理视图渲染前的数据等。
    • 当你需要利用 Spring 的依赖注入功能时,拦截器可以直接注入 Spring Bean,而过滤器则不能。

4. 示例代码

过滤器示例
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
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 {
        // 在请求到达 Servlet 之前执行的逻辑
        System.out.println("Before request processing");

        // 继续链式调用下一个过滤器或目标资源
        chain.doFilter(request, response);

        // 在响应返回给客户端之前执行的逻辑
        System.out.println("After request processing");
    }

    @Override
    public void destroy() {
        // 销毁逻辑
    }
}
拦截器示例
import org.springframework.stereotype.Component; 
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求到达控制器之前执行的逻辑
        System.out.println("Before controller method execution");
        return true; // 返回 true 表示继续执行,返回 false 表示中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在控制器方法执行完毕后,但在视图渲染之前执行的逻辑
        System.out.println("After controller method execution, before view rendering");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在视图渲染完成后执行的逻辑
        System.out.println("After view rendering");
    }
}

5. 总结

  • 过滤器 是 Servlet 规范的一部分,适用于所有基于 Servlet 的应用,作用范围更广,可以在请求到达任何 Servlet 之前或之后进行处理。
  • 拦截器 是 Spring MVC 框架特有的机制,只能应用于进入 Spring MVC 控制器的请求,提供了更细粒度的控制,并且可以充分利用 Spring 的依赖注入和 AOP 功能。

根据你的具体需求,选择合适的工具来处理跨切面的逻辑。如果你只需要对进入 Spring MVC 控制器的请求进行处理,建议使用拦截器;如果你需要对所有请求进行全局处理,或者处理与 Spring MVC 无关的请求,则应该使用过滤器。

标签:控制器,拦截器,请求,Spring,Filter,过滤器,Interceptor,Servlet
From: https://blog.csdn.net/mqwguardain/article/details/144668936

相关文章

  • MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
     1.1创建ThreadLocal工具类(作为业务逻辑结果存放类)packageorg.springblade.sample.utils;publicclassQueryContext{ privatestaticfinalThreadLocal<Long>totalInThreadLocal=newThreadLocal<>(); publicstaticvoidsetTotalIn(longtotalIn){ totalInT......
  • 过滤器Filter vs 拦截器Interceptor
    过滤器FilterJavaWeb三大组件之一,可以把对资源的请求拦截下来,实现一些特殊功能,比如登录校验、统一编码处理、敏感字符处理等拦截器Interceptor概念:一种动态拦截方法调用的机制,类似于Filter,Spring框架提供,用于动态拦截控制器方法的执行作用:拦截请求,在指定的方法调用的前后,根......
  • Struts2文件上传(二) 深入FileUploadInterceptor
      Struts2框架本身没有文件上传的功能模块,而是利用现在流行的几个文件上传开源框架,如Common-FileUpload和COS等。Struts2利用拦截器将这些文件上传的框架巧妙的集成进来,不能不被称为一个优秀的拿来主义者。由于拦截器的使用,我们使用Struts2实现文件上传变的非常容易,似乎什么也......
  • vue-axios响应请求拦截器
    importaxiosfrom"axios";//import{ElMessage}from'element-plus'import{BASE_URL,TIMEOUT}from"../config";constAxios=axios.create({ //后端url地址baseURL:BASE_URL,//设置超时时间timeout:TIMEOUT,//请求头类型/......
  • Day33:安全开发-JavaEE应用&SQL预编译&Filter过滤器&Listener监听器&访问控制
    一,JavaEE-过滤器Filter1,过滤器的含义:Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现......
  • Interceptor 拦截器
    用于在程序执行过程中拦截或截取特定的操作或事件。它可以在操作发生之前、之后进行自定义的处理。注册配置拦截器@Slf4j@ComponentpublicclassDemoInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpS......
  • Particle Filter-Based Robot Localization
    Project:ParticleFilter-BasedRobotLocalizationNovember12,2023AbstractBasedontheinformationfromthe”ParticleFilter”slides,hereisaprojectideaforstudentsinvolvingtheimplementationofaParticleFilterforlocalizationandnavigationu......
  • Cookie、Session、Filter过滤器
    一、Cookie####1.1工作原理客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态......
  • 【语法】高阶函数:map、filter、sorted、reduce
    map【python】Python高阶函数--map函数的详细语法分析与应用实战_pythonmap-CSDN博客filter【python】Python高阶函数--filter函数的高阶用法解析与应用实战_python的filter函数的用法-CSDN博客sorted【python】Python高阶函数--sorted函数的高阶用法解析与应用实战_高阶函......
  • Mybatis 拦截器实现单数据源内多数据库切换
    作者:京东保险王奕龙物流的分拣业务在某些分拣场地只有一个数据源,因为数据量比较大,将所有数据存在一张表内查询速度慢,也为了做不同设备数据的分库管理,便在这个数据源内创建了多个不同库名但表完全相同的数据库,如下图所示:现在需要上线报表服务来查询所有数据库中的数据进行统计,......