温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

拦截器与过滤器区别

发布时间:2026-08-30 04:52:39 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

在 Java Web(尤其是 Spring/Spring Boot)开发中,拦截器(Interceptor)过滤器(Filter) 都用于请求处理前后的增强,但它们在作用范围、执行时机、实现方式和使用场景上都有明显区别。


一、核心区别概览

对比项 过滤器(Filter) 拦截器(Interceptor)
所属规范 Servlet 规范 Spring 框架
执行时机 请求进入 Servlet 前 进入 Controller 前
是否能访问 Controller ❌ 不能 ✅ 能
是否能获取 Spring Bean ❌ 不能直接 ✅ 可以
是否依赖 Spring ❌ 不依赖 ✅ 依赖
控制粒度 粗(URL 级别) 细(方法 / 类级别)
返回值 void boolean / 中断流程
典型应用场景 编码、跨域、日志、安全 登录校验、权限、参数校验

二、执行顺序(非常重要)

一次 HTTP 请求的执行顺序如下:

请求
 ↓
Filter(过滤器)
 ↓
DispatcherServlet
 ↓
Interceptor.preHandle()
 ↓
Controller
 ↓
Interceptor.postHandle()
 ↓
Interceptor.afterCompletion()
 ↓
Filter
 ↓
响应

Filter 更早执行,Interceptor 更晚执行


三、过滤器(Filter)

1️⃣ 特点

  • 属于 Servlet 规范
  • 在请求进入 Servlet 前执行
  • 处理的是 HTTP 请求/响应
  • 与 Spring 无关

2️⃣ 示例代码

@Component
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
            throws IOException, ServletException {
        System.out.println("Filter before");
        chain.doFilter(request, response);
        System.out.println("Filter after");
    }
}

3️⃣ 常见用途

  • 字符编码(UTF-8)
  • 跨域处理(CORS)
  • 请求日志
  • XSS / SQL 注入过滤
  • 统一参数处理

四、拦截器(Interceptor)

1️⃣ 特点

  • 属于 Spring MVC
  • 在 Controller 调用前后执行
  • 可以访问:
    • HandlerMethod
    • Controller 方法
    • ModelAndView
  • 支持中断请求

2️⃣ 示例代码

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) {
        System.out.println("Interceptor preHandle");
        return true; // false 表示中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView modelAndView) {
        System.out.println("Interceptor postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception ex) {
        System.out.println("Interceptor afterCompletion");
    }
}

3️⃣ 注册拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/login");
    }
}

4️⃣ 常见用途

  • 登录校验
  • 权限控制
  • 接口幂等性校验
  • 方法级别日志
  • 接口耗时统计

五、如何选择?

✅ 用 Filter 的场景

  • 与业务无关
  • 想在处理 Servlet 前统一处理
  • 不想依赖 Spring

✅ 用 Interceptor 的场景

  • 需要访问 Controller / 方法
  • 需要 Spring 容器中的 Bean
  • 需要更细粒度的控制

六、一句话总结

Filter 偏底层,Interceptor 偏业务。

如果你愿意,我也可以:

  • 时序图画执行流程
  • 结合 Spring Boot 实战场景说明怎么选
  • 对比 AOP vs Interceptor vs Filter
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI