1. 基本概念

1.1 过滤器(Filter)

  • 来源:Servlet 规范(JavaEE 标准),不是 Spring 特有的。

  • 拦截范围:可以拦截所有请求(包括静态资源:CSS、JS、图片等)。

  • 执行位置:在 DispatcherServlet 之前执行。

  • 作用:对请求和响应做统一处理。

常见内置过滤器:CharacterEncodingFilterHiddenHttpMethodFilter


1.2 拦截器(Interceptor)

  • 来源:Spring MVC 提供的功能。

  • 拦截范围:只拦截由 DispatcherServlet 分发的请求(即 Controller 层,静态资源不会被拦截)。

  • 执行位置:在 Controller 方法前后执行,并可在视图渲染前后做处理。

  • 作用:业务相关的拦截和逻辑增强。

常见应用:权限校验、日志记录、上下文填充。


2. 执行流程对比

📌 请求生命周期:

浏览器请求 → Tomcat(Servlet容器) 
   → Filter(过滤器) 
      → DispatcherServlet 
         → Interceptor(拦截器) 
            → Controller(业务逻辑) 
         ← Interceptor(返回) 
      ← DispatcherServlet 
   ← Filter 
← 响应返回浏览器

🔑 区别:

  • Filter 更靠前,更底层,管“全局系统”

  • Interceptor 更靠近业务,管“Controller逻辑”


3. 核心区别

对比项 过滤器 Filter 拦截器 Interceptor
来源 Java Servlet 规范 Spring MVC 框架
执行时机 DispatcherServlet 之前 DispatcherServlet 之后,Controller 执行前后
拦截对象 所有请求(含静态资源) 仅 Controller 请求
粒度 粗,偏系统级 细,偏业务逻辑
配置方式 @WebFilterFilterRegistrationBean 实现 HandlerInterceptor 并注册到 WebMvcConfigurer
适用场景 编码、跨域、XSS 过滤 登录校验、日志、权限控制

4. 使用场景

4.1 过滤器常见场景

  1. 统一编码处理(防止中文乱码)

  2. 跨域处理 CORS(处理 OPTIONS 请求等)

  3. XSS 攻击过滤

  4. SQL 注入拦截

  5. 静态资源访问控制


4.2 拦截器常见场景

  1. 登录校验(如检查 Session 或 Token)

  2. 接口权限控制

  3. 接口调用日志、耗时统计

  4. 请求参数预处理(填充用户上下文到 ThreadLocal)

  5. 国际化处理


5. 代码示例

5.1 Filter 示例(编码过滤器)

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/*") // 拦截所有请求
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        System.out.println("Filter:统一编码处理");
        chain.doFilter(request, response); // 放行
    }
}

5.2 Interceptor 示例(登录拦截器)

import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("user");
        if (user == null) {
            response.sendRedirect("/login");
            return false; // 拦截
        }
        System.out.println("Interceptor:用户已登录");
        return true; // 放行
    }
}

注册拦截器:

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 WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/login", "/css/**", "/js/**"); // 排除
    }
}

6. 总结口诀

  • Filter 管系统:跨域、编码、安全防护。

  • Interceptor 管业务:登录校验、权限、日志统计。

📌 执行顺序:
Filter → DispatcherServlet → Interceptor → Controller → Interceptor → DispatcherServlet → Filter

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐