Spring MVC中的拦截器和Servlet中的filter(过滤器)有什么区别?

一、作用范围

  1. 过滤器(Filter):

    • 作用于整个 Web 应用程序,可以对所有的 Servlet 和 JSP 等资源进行过滤处理,是 Servlet 规范的一部分,独立于特定的框架。
    • 例如,一个用于编码转换的过滤器可以对所有请求和响应进行字符集的转换,无论请求是针对哪个具体的业务模块。
  2. 拦截器(Interceptor):

    • 主要作用于 Spring MVC 框架中的请求处理过程,仅对 Spring MVC 管理的控制器方法的调用进行拦截。
    • 比如,在一个基于 Spring MVC 的项目中,拦截器可以专门拦截特定的控制器方法,进行权限验证、日志记录等操作,而不会影响到其他非 Spring MVC 的资源访问。

二、实现方式

  1. 过滤器(Filter):
    • 通过实现javax.servlet.Filter接口来定义过滤器,并在web.xml文件中进行配置,或者使用 Servlet 3.0 及以上版本提供的注解方式进行配置。
    • 例如:
   import javax.servlet.Filter;
   import javax.servlet.FilterChain;
   import javax.servlet.FilterConfig;
   import javax.servlet.ServletException;
   import javax.servlet.ServletRequest;
   import javax.servlet.ServletResponse;
   import javax.servlet.annotation.WebFilter;
   import java.io.IOException;

   @WebFilter(filterName = "MyFilter", urlPatterns = "/*")
   public class MyFilter implements Filter {
       @Override
       public void init(FilterConfig filterConfig) throws ServletException {
           // 过滤器初始化
       }

       @Override
       public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
           // 过滤逻辑处理
           filterChain.doFilter(servletRequest, servletResponse);
       }

       @Override
       public void destroy() {
           // 过滤器销毁
       }
   }

  1. 拦截器(Interceptor):
    • 通过实现org.springframework.web.servlet.HandlerInterceptor接口,或者继承HandlerInterceptorAdapter类来定义拦截器,并在 Spring MVC 的配置文件中进行注册。
    • 例如:
   import org.springframework.web.servlet.HandlerInterceptor;
   import org.springframework.web.servlet.ModelAndView;

   import javax.servlet.http.HttpServletRequest;
   import javax.servlet.http.HttpServletResponse;

   public class MyInterceptor implements HandlerInterceptor {
       @Override
       public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
           // 在请求处理之前进行拦截处理
           return true;
       }

       @Override
       public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
           // 在请求处理之后,视图渲染之前进行拦截处理
       }

       @Override
       public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
           // 在整个请求结束之后进行拦截处理
       }
   }

然后在 Spring MVC 的配置类中注册拦截器:

   import org.springframework.context.annotation.Configuration;
   import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
   import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

   @Configuration
   public class WebMvcConfig implements WebMvcConfigurer {
       @Override
       public void addInterceptors(InterceptorRegistry registry) {
           registry.addInterceptor(new MyInterceptor());
       }
   }

三、执行顺序

  1. 过滤器(Filter):

    • 过滤器的执行顺序是按照在web.xml文件中配置的顺序或者注解中定义的顺序来执行的。
    • 例如,如果有多个过滤器 A、B、C,配置顺序为 A、B、C,那么请求到达服务器时,会先经过过滤器 A,然后是过滤器 B,最后是过滤器 C;响应返回时,顺序则相反,先经过过滤器 C 的doFilter方法之后的逻辑,然后是过滤器 B,最后是过滤器 A。
  2. 拦截器(Interceptor):

    • 拦截器的执行顺序是按照在 Spring MVC 配置中注册的顺序执行的。
    • 例如,有三个拦截器 Interceptor1、Interceptor2、Interceptor3,注册顺序为 Interceptor1、Interceptor2、Interceptor3,那么在请求处理过程中,会先执行 Interceptor1 的preHandle方法,然后是 Interceptor2 的preHandle方法,接着是 Interceptor3 的preHandle方法。在请求处理完成后,返回响应时,执行顺序则相反,先执行 Interceptor3 的afterCompletion方法,然后是 Interceptor2 的afterCompletion方法,最后是 Interceptor1 的afterCompletion方法。

四、功能重点

  1. 过滤器(Filter):

    • 更侧重于对请求和响应的通用处理,如字符编码转换、压缩和解压缩、日志记录等与业务逻辑关系不大的通用功能。
    • 例如,一个用于统一设置响应头的过滤器,可以在所有的请求响应中添加特定的头部信息,而不关心具体的业务处理过程。
  2. 拦截器(Interceptor):

    • 主要用于与业务逻辑相关的处理,如权限验证、性能监控、日志记录与特定业务流程相关的操作等。
    • 比如,一个拦截器可以在用户请求特定的业务模块时,进行用户权限的验证,如果用户没有权限访问该模块,则可以直接返回错误信息,阻止请求继续传递到控制器方法。

你可能感兴趣的:(spring,mvc,servlet)