Filter、Interceptor、Spring Aop 区别分析

1. 核心概念与职责对比

维度 Filter Interceptor Spring AOP
所属层级 Servlet 容器层面 Spring MVC 框架层面 Spring 框架层面
作用范围 所有请求(包括静态资源) Controller 请求处理流程 方法调用(业务层/Service)
依赖框架 Servlet 规范(无 Spring 依赖) Spring MVC Spring AOP
核心职责 处理 HTTP 请求/响应 拦截 Controller 请求 横切关注点(如日志、事务)
执行顺序 最先执行(在 Servlet 前) 在 Filter 之后、AOP 之前 在 Interceptor 之后

2. 工作原理与执行流程

请求处理流程
HTTP Request → Filter → DispatcherServlet → Interceptor → Controller → AOP → Service → DAO
HTTP Response ← Filter ← DispatcherServlet ← Interceptor ← ViewResolver
详细说明
  1. Filter

    • 基于 Servlet 规范,拦截所有 HTTP 请求和响应。
    • 可以修改请求头、请求参数,或响应内容。
    • 例如:字符编码过滤、跨域处理、全局日志记录。
  2. Interceptor

    • 基于 Spring MVC,拦截 Controller 的请求处理流程。
    • 可以访问 Handler(Controller 方法)和 ModelAndView。
    • 例如:权限验证、请求参数预处理、接口耗时统计。
  3. Spring AOP

    • 基于动态代理(JDK/CGLIB),拦截方法的执行。
    • 作用于 Spring Bean 的方法调用。
    • 例如:事务管理、方法级日志、性能监控。

3. 使用方法与示例

(1) Filter 的使用
  • 实现方式:实现 javax.servlet.Filter 接口。
  • 配置方式
    • 使用 @WebFilter 注解(Servlet 3.0+)或 web.xml
  • 示例
    @WebFilter(urlPatterns = "/*")
    public class LogFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
            // 请求前处理
            System.out.println("Request URL: " + ((HttpServletRequest) request).getRequestURL());
            chain.doFilter(request, response); // 放行请求
            // 响应后处理
        }
    }
    
(2) Interceptor 的使用
  • 实现方式:实现 HandlerInterceptor 接口。
  • 配置方式:注册到 WebMvcConfigurer
  • 示例
    public class AuthInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
            // 在 Controller 方法前执行
            if (!checkAuth(request)) {
                response.sendError(401, "Unauthorized");
                return false; // 中断请求
            }
            return true;
        }
    }
    
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**");
        }
    }
    
(3) Spring AOP 的使用
  • 实现方式:使用 @Aspect 注解定义切面。
  • 配置方式:启用 @EnableAspectJAutoProxy
  • 示例
    @Aspect
    @Component
    public class LogAspect {
        @Around("execution(* com.example.service.*.*(..))")
        public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable {
            // 方法执行前
            long start = System.currentTimeMillis();
            Object result = joinPoint.proceed(); // 执行目标方法
            // 方法执行后
            long duration = System.currentTimeMillis() - start;
            System.out.println("Method " + joinPoint.getSignature() + " took " + duration + "ms");
            return result;
        }
    }
    

4. 使用场景对比

场景 推荐工具 理由
全局请求处理 Filter 处理所有 HTTP 请求(如跨域、字符编码、全局日志)。
Controller 层拦截 Interceptor 拦截特定 Controller 请求(如权限校验、参数预处理)。
业务方法增强 Spring AOP 实现事务管理、方法级日志、性能监控等横切关注点。
静态资源处理 Filter 修改静态资源请求的响应头(如缓存控制)。
接口级访问控制 Interceptor 根据接口路径动态判断权限。
方法级动态代理 Spring AOP 动态修改方法行为(如重试机制、缓存逻辑)。

5. 关键区别总结

  1. 作用范围

    • Filter:处理所有 HTTP 请求(包括静态资源)。
    • Interceptor:仅拦截 Spring MVC 处理的请求(即 Controller 映射的请求)。
    • AOP:拦截 Spring Bean 的方法调用(如 Service 层)。
  2. 依赖关系

    • Filter:不依赖 Spring,属于 Servlet 规范。
    • Interceptor:依赖 Spring MVC 框架。
    • AOP:依赖 Spring AOP 模块。
  3. 执行顺序

    • Filter → Interceptor → AOP → Controller → Service
  4. 灵活性

    • Filter:功能简单,无法直接访问 Spring 上下文。
    • Interceptor:可以获取 Spring 管理的 Bean。
    • AOP:支持复杂的切面逻辑,但只能拦截 Spring Bean 的方法。

6. 常见问题

Q1:Filter 和 Interceptor 如何选择?
  • 如果需要处理所有请求(包括静态资源)或修改 HTTP 协议相关内容(如请求头),用 Filter
  • 如果需要基于 Spring 上下文进行业务逻辑拦截(如权限验证),用 Interceptor
Q2:AOP 能替代 Interceptor 吗?
  • 不能。AOP 作用于方法调用层,而 Interceptor 拦截的是请求处理流程,两者职责不同。
Q3:如何控制 Filter 的执行顺序?
  • 使用 @Order 注解或在 web.xml 中配置 顺序。

总结

  • Filter:Servlet 层面的“守门人”,处理全局 HTTP 请求/响应。
  • Interceptor:Spring MVC 的“流程控制器”,拦截 Controller 请求。
  • AOP:业务逻辑的“手术刀”,精准增强方法级功能。

选择建议:根据需求层级(HTTP 协议 → MVC 流程 → 业务方法)选择合适的工具,三者可结合使用以实现完整拦截链。

你可能感兴趣的:(Java,Spring,spring,java,后端)