请简述Spring MVC 的拦截器和 Filter 过滤器有什么差别?

参考回答

Spring MVC 的拦截器和 Filter 过滤器都是用于请求处理过程中进行预处理和后处理的机制,但它们之间有一些关键区别:

  1. 执行时机
    • Filter:在请求到达 Spring MVC 控制器之前和响应返回之前执行。它是基于 Servlet 规范的,在整个 web 应用生命周期中都可以使用。
    • Interceptor:在请求到达 Spring MVC 控制器之前、控制器执行之后以及视图渲染之前执行,专门用于 Spring MVC 的请求处理过程。
  2. 作用范围
    • Filter:Filter 可以跨越整个应用的所有请求进行拦截,适用于全局级别的操作,如日志记录、请求编码等。
    • Interceptor:Interceptor 是 Spring MVC 专用的,它只影响 Spring MVC 的请求处理过程,可以更精细地操作请求、控制器、模型和视图。
  3. 配置方式
    • Filter:通过 web.xml 配置或注解的方式注册,通常是全局的,可以对所有请求进行处理。
    • Interceptor:通过 Spring 配置文件或者 @Configuration 注解类中的 WebMvcConfigurer 配置。
  4. 工作原理
    • Filter:Filter 在 servlet 容器中工作,直接操作 HTTP 请求和响应。它独立于 Spring MVC,处理所有的 HTTP 请求,包括静态资源等。
    • Interceptor:Interceptor 是 Spring MVC 的一部分,工作于 Spring 的 DispatcherServlet 之前和之后,专门处理与 Spring MVC 控制器和视图渲染相关的业务。

详细讲解与拓展

  1. Filter(过滤器)
    • 作用:Filter 是 Servlet 规范的一部分,可以用于请求的预处理(如日志记录、用户认证等)和后处理(如响应压缩、响应时间统计等)。它是基于 Servlet 的请求-响应过滤机制,在请求到达 Spring MVC 控制器之前就会进行处理。
    • 工作流程
      • 在请求发送到 Spring MVC 之前,Filter 会处理请求。
      • 在响应返回客户端之前,Filter 也可以进行操作。

    例如,Filter 用于日志记录:

    public class LoggingFilter implements Filter {
       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
               throws IOException, ServletException {
           System.out.println("Request received: " + request.getRemoteAddr());
           chain.doFilter(request, response);
           System.out.println("Response sent to: " + request.getRemoteAddr());
       }
    }
    
  2. Interceptor(拦截器)
    • 作用:Interceptor 是 Spring MVC 特有的,它专门用于处理请求到达 Spring MVC 控制器之前、控制器之后、视图渲染之前的任务。它可以访问到 Spring 的处理过程,因此非常适合处理业务逻辑相关的任务(如权限验证、事务管理等)。
    • 工作流程
      • 请求到达控制器之前,Interceptor 的 preHandle 方法被执行。
      • 请求经过控制器方法后,postHandle 方法被执行,控制器处理完后,视图渲染之前。
      • 最后,afterCompletion 方法被执行,通常用于清理资源。

    例如,拦截器用于权限验证:

    public class AuthInterceptor implements HandlerInterceptor {
       @Override
       public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
               throws Exception {
           String user = (String) request.getSession().getAttribute("user");
           if (user == null) {
               response.sendRedirect("/login");
               return false;
           }
           return true;
       }
    }
    
  3. 核心差异对比
    • 执行时机
      • Filter 作用于 Servlet 容器级别,在请求到达 Spring MVC 控制器之前就会执行;
      • Interceptor 只在 Spring MVC 控制器处理过程中参与,处理请求、控制器执行、视图渲染等过程中的不同阶段。
    • 功能定位
      • Filter 更适合全局性操作,如日志、请求编码、CORS 处理等;
      • Interceptor 适合与 Spring MVC 请求流程相关的业务逻辑处理,如权限校验、事务管理、性能监控等。
    • 配置方式
      • Filter 需要在 web.xml 配置或通过注解注册,适用范围更广;
      • Interceptor 需要在 Spring 配置类中通过 WebMvcConfigurer 接口配置,主要作用于 Spring MVC 请求。

总结

  • Filter:在 Servlet 级别工作,主要用于处理 HTTP 请求和响应的全局性操作,适用于日志记录、请求编码、CORS 等。
  • Interceptor:专门用于 Spring MVC 请求处理过程中,允许精细化控制,如权限校验、事务管理等,适合与 Spring MVC 的控制器、视图相关的处理。

通过理解这两者的差异,开发者可以根据不同的需求选择合适的机制来处理请求和响应。

发表评论

后才能评论