拦截器和过滤器详解

在 Java Web 开发中,拦截器(Interceptor)和过滤器(Filter)是两种常见的请求处理机制,它们用于对请求和响应进行预处理和后处理

1. 过滤器(Filter)

1.1 作用

Filter 主要用于对 请求(request)响应(response) 进行预处理和后处理,通常用于请求日志记录、编码设置、安全检查等场景

1.2 工作原理

  • Filter 作用于 Servlet 之前,对请求进行预处理
  • 处理完请求后,Filter 也可以对响应进行后处理
  • 通过 FilterChain 将请求传递给下一个 Filter 或 Servlet

1.3 实现步骤

  1. 实现 javax.servlet.Filter 接口
  2. 重写 doFilter 方法
  3. web.xml 中进行配置,或者使用 @WebFilter 注解

1.4 示例代码

java 复制代码
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*") // 作用于所有请求
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Filter: 请求被拦截");
        chain.doFilter(request, response); // 继续请求
        System.out.println("Filter: 响应被拦截");
    }
}

2. 拦截器(Interceptor)

2.1 作用

Interceptor 主要用于 拦截控制器(Controller)的执行 ,在方法执行前后视图渲染前执行特定逻辑,如权限控制、日志记录、事务管理等

2.2 工作原理

  • Interceptor 依赖 Spring MVC ,拦截的是 Controller 的执行过程
  • 可以在**方法调用前(preHandle)、方法调用后(postHandle)、视图渲染后(afterCompletion)**执行逻辑

2.3 实现步骤

  1. 实现 HandlerInterceptor 接口
  2. 重写 preHandlepostHandleafterCompletion 方法
  3. 在 Spring 配置中注册拦截器

2.4 示例代码

java 复制代码
import org.springframework.web.servlet.HandlerInterceptor;
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 {
        System.out.println("Interceptor: 进入 Controller 前");
        return true; // 继续执行 Controller 方法
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor: 方法执行完毕");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Interceptor: 视图渲染完成");
    }
}

2.5 拦截器的注册

java 复制代码
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 {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

3. 过滤器与拦截器的对比

比较项 过滤器(Filter) 拦截器(Interceptor)
作用范围 作用于 所有请求(包括静态资源) 作用于 Spring MVC 控制器
依赖 Servlet 规范 Spring MVC
触发时机 Servlet 之前 处理请求 Controller 执行前后 处理请求
适用场景 编码设置、日志记录、权限控制 认证授权、日志、事务处理
处理方式 doFilter 方法 preHandlepostHandleafterCompletion

4. 总结

  1. Filter 适用于所有请求 ,包括静态资源,可以用于通用的请求预处理和后处理
  2. Interceptor 仅拦截 Controller 方法 ,适用于控制器层面的拦截,如权限控制、事务管理
  3. 在 Spring Boot 应用中,一般推荐使用 Interceptor 来拦截业务逻辑,而使用 Filter 处理通用的请求逻辑
相关推荐
智界工具库28 分钟前
《IDEA 2025 长效使用指南:2099 年有效期配置实战之JetBrains全家桶有效》
java·ide·intellij-idea
Mr.456732 分钟前
MQTT通信实现方案(Spring Boot 3 集成MQTT)
java·spring boot·后端
徐子童40 分钟前
JVM高频面试题---类加载机制
java·jvm·面试题
青草地溪水旁1 小时前
设计模式(C++)详解——迭代器模式(2)
java·c++·设计模式·迭代器模式
9号达人1 小时前
Java18 新特性详解与实践
java·后端·面试
我不是混子1 小时前
java浮点数精度问题及解决方案
java·后端
花心蝴蝶.1 小时前
Java 中的代理模式
java·开发语言·代理模式
舒克起飞了2 小时前
设计模式——单例模式
java·单例模式·设计模式
Java&Develop2 小时前
GitLab-如何基于现有项目仓库,复制出新的项目仓库
java
一只乔哇噻2 小时前
java后端工程师进修ing(研一版‖day49)
java·开发语言