Spring中过滤器和拦截器的区别及具体实现方式
在 Spring 框架中,过滤器(Filter) 和 拦截器(Interceptor) 都是用于处理 HTTP 请求的中间件,但它们在作用范围、实现方式和生命周期上有显著区别。以下是详细对比和实现方式:
核心区别
| 特性 | 过滤器 (Filter) | 拦截器 (Interceptor) |
|---|---|---|
| 规范 | Servlet 规范 (J2EE 标准) | Spring 框架特有 |
| 作用范围 | 所有 Web 资源(Servlet、JSP、静态资源) | 仅 Spring MVC 管理的 Controller 请求 |
| 依赖 | 依赖 Servlet 容器(如 Tomcat) | 依赖 Spring 容器 |
| 拦截时机 | 在请求进入 Servlet 前 / 响应发送到客户端前 | 在请求进入 Controller 前 / 后 / 视图渲染后 |
| 获取 Spring Bean | 不能直接获取(需通过工具类) | 可直接获取 Spring Bean |
| 异常处理 | 无法使用 Spring 的异常处理机制 | 可结合 @ControllerAdvice 统一异常处理 |
实现方式
1. 过滤器 (Filter) 实现
过滤器是 Servlet 规范的一部分,通过实现 javax.servlet.Filter 接口实现。
步骤:
- 创建 Filter 类
import javax.servlet.*;
import java.io.IOException;
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
// 初始化逻辑
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 1. 请求到达 Controller 前的逻辑
System.out.println("Before Controller (Filter)");
// 放行请求
chain.doFilter(request, response);
// 2. 响应返回客户端前的逻辑
System.out.println("After Controller (Filter)");
}
@Override
public void destroy() {
// 销毁逻辑
}
}- 注册过滤器(Spring Boot 中)
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<CustomFilter> customFilter() {
FilterRegistrationBean<CustomFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new CustomFilter());
bean.addUrlPatterns("/*"); // 拦截所有路径
bean.setOrder(1); // 执行顺序
return bean;
}
}2. 拦截器 (Interceptor) 实现
拦截器是 Spring MVC 的组件,通过实现 HandlerInterceptor 接口。
步骤:
- 创建 Interceptor 类
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 在 Controller 方法执行前调用
System.out.println("Before Controller (Interceptor)");
return true; // true=放行, false=中断请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
// 在 Controller 方法执行后、视图渲染前调用
System.out.println("After Controller (Interceptor)");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) {
// 在整个请求完成后调用(视图渲染完毕)
System.out.println("After View Render (Interceptor)");
}
}- 注册拦截器
import org.springframework.beans.factory.annotation.Autowired;
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 {
@Autowired
private CustomInterceptor customInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor)
.addPathPatterns("/**") // 拦截所有路径
.excludePathPatterns("/login"); // 排除路径
}
}执行顺序示例
假设请求路径被过滤器和拦截器同时拦截:
1. Filter: doFilter() [前逻辑] 2. Interceptor: preHandle() 3. Controller 方法执行 4. Interceptor: postHandle() 5. 视图渲染 6. Interceptor: afterCompletion() 7. Filter: doFilter() [后逻辑]
如何选择?
| 场景 | 推荐使用 |
|---|---|
| 全局日志、字符编码、安全过滤 | Filter |
| 权限验证、参数预处理 | Interceptor |
| 需要 Spring 容器功能 | Interceptor |
| 非 Spring 项目 | Filter |
最佳实践:优先使用 Interceptor(可集成 Spring 特性),若需处理静态资源或深度请求/响应修改,则用 Filter。
到此这篇关于Spring中过滤器和拦截器的区别及具体实现的文章就介绍到这了,更多相关Spring过滤器和拦截器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Maven的porfile与SpringBoot的profile结合使用案例详解
这篇文章主要介绍了Maven的porfile与SpringBoot的profile结合使用,通过maven的profile功能,在打包的时候,通过-P指定maven激活某个pofile,这个profile里面配置了一个参数activatedProperties,不同的profile里面的这个参数的值不同,需要的朋友可以参考下吧2021-12-12
Spring security 自定义过滤器实现Json参数传递并兼容表单参数(实例代码)
这篇文章主要介绍了Spring security 自定义过滤器实现Json参数传递并兼容表单参数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-01-01
MybatisPlus实现多表的关联查询,实现分页,多条件查询全过程
文章介绍了如何通过商品表与供应商表的关联查询,实现商品信息的模糊查询,具体包括建立DAO层接口、实体类和请求参数类,编写SQL查询语句,以及在控制层处理查询请求2026-03-03


最新评论