开发者

Spring中过滤器和拦截器的区别及具体实现方式

目录
  • 核心区别
  • 实现方式
    • 1. 过滤器 (Filter) 实现
    • 2. 拦截器 (Interceptor) 实现
  • 执行顺序示例
    • 如何选择?

      在 Spring 框架中,过滤器(Filter)拦截器(Interceptor) 都是用于处理 HTTP 请求的中间件,但它们在作用范围、实现方式和生命周期上有显著区别。以下是详细对比和实现方式:

      核心区别

      特性过滤器 (Filter)拦截器 (Interceptor)
      规范Servlet 规范 (J2EE 标准)Spring 框架特有
      作用范围所有 Web 资源(Servlet、JSP、静态资源)仅 Spring MVC 管理的 Controller 请求
      依赖依赖 Servlet 容器(如 Tomcat)依赖 Spring 容器
      拦截时机在请求进入 Servlet 前 / 响应发送到客户端前在请求进入 Controller 前 / 后 / 视图渲染后
      获取 Spring Bean不能直接获取(需通过工具类)可直接获取 Spring Bean
      异常处理无法使用 Spring 的异常处理机制可结合 @ControllerAdvice 统一异常处理

      实现方式

      1. 过滤器 (Filter) 实现

      过滤器是 Servlet 规范的一部分,通过实现 Javax.servlet.Filter 接口实现。

      步骤:

      1. 创建 Filter 类
      import javax.servlet.*;
      import java.io.IOException;
      public class CustomFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) {
              // 初始化逻辑
          }
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
              throws IOException, ServletException {
              // 1. 请求到达 Controller 前的逻辑
              System.out.println("Before Controller (Filter)");
              // 放行请求
              chain.doFilter(request, response);
              // 2. 响应返回客户端前的逻辑
              System.out.println("After Controller (Filter)");
          }
          @Override
          public void destroy() {
              // 销毁逻辑
          }
      }
      1. 注册过滤器python(Spring Boot 中)
      import org.springframework.boot.web.servlet.FilterRegistrationBean;
      import owww.devze.comrg.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      @Configuration
      public class FilterConfig {
          @Bean
          public FilterRegistrationBean<CustomFilter> customFilter() {
              FilterRegistrationBean<CustomFilter> bean = new FilterRegistrationBean<>();
              bean.setFilter(new CustomFilter());
              bean.addUrlPatterns("/*"); // 拦截所有路径
              bean.setOrder(1); // 执行顺序
              return bean;
          }
      }

      2. 拦截器 (Interceptor) 实现

      拦截器是 Spring MVC 的组件,通过实现 HandlerInterceptor 接口。

      步骤:

      1. 创建 Interceptor 类
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import org.springframework.stereotype.Component;
      import org.springframework.web.servlet.HandlerInterceptor;
      import org.springframework.web.servlet.ModelAndView;
      @Component
      public class CustomInterceptor implements HandlerInterceptor {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
              // 在 Controller 方法执行前调用
              System.out.println("Before Controller (Interceptor)");
              return true; // true=放行, false=中断请求
          }
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
                                 ModelAndView modelAndView) {
              // 在 Controller 方法执行后、视图渲染前调用
              System.out.println("After Controller (Interceptor)");
          }
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
                                      Object handler, Exception ex) {
              // 在整个请求完成后调用(视图渲染完毕)
              System.out.println("After View Render (Interceptor)");
          }
      }
      1. 注册拦截器
      import org.springframework.beans.factory.annotation.Autowired;
      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 InterceptorConfig implements WebMvcConfigurer {
          @Autowired
          private CustomInterceptor customInterceptor;
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(customInterceptor)
                      .addPathPatterns("/**")    // 拦截所有路径
                      .excludePathPatterns("/login"); // 排除路径
          }
      }

      执行顺序示例

      假设请求路径被过滤器和拦截器同时拦截:

      1. Filter: doFilter() [前逻辑]
      2. Interceptor: preHandle()
      3. ContrUmqnpFOBooller 方法执行
      4. Interceptor: postHandle()
      5. 视图渲染
      6. Inwww.devze.comterceptor: afterCompletion()
      7. Filter: doFipythonlter() [后逻辑]

      如何选择?

      场景推荐使用
      全局日志、字符编码、安全过滤Filter
      权限验证、参数预处理Interceptor
      需要 Spring 容器功能Interceptor
      非 Spring 项目Filter

      最佳实践:优先使用 Interceptor(可集成 Spring 特性),若需处理静态资源或深度请求/响应修改,则用 Filter。

      到此这篇关于Spring中过滤器和拦截器的区别及具体实现的文章就介绍到这了,更多相关Spring过滤器和拦截器内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜