拦截器和过滤器详解

在 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 处理通用的请求逻辑
相关推荐
wang09074 小时前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java4 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
豆瓣鸡5 小时前
Spring Cloud笔记
spring·spring cloud
不知名的老吴5 小时前
线程的生命周期之线程“插队“
java·开发语言·python
ANnianStriver5 小时前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
云烟成雨TD6 小时前
Spring AI 1.x 系列【56】用大模型评判大模型:递归顾问实现自动化评估方案
人工智能·spring·自动化
杨了个杨89826 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
陈鋆7 小时前
Spring AI Framework(二:模块分析)
spring·ai
马士兵教育8 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习